#include maps\mp\zombies\_zm; #include maps\mp\_utility; #include common_scripts\utility; #include maps\mp\zombies\_zm_utility; #include maps\mp\gametypes_zm\_hud_util; round_start() { if ( isdefined( level.round_prestart_func ) ) [[ level.round_prestart_func ]](); else { n_delay = 2; if ( isdefined( level.zombie_round_start_delay ) ) n_delay = level.zombie_round_start_delay; wait( n_delay ); } level.zombie_health = level.zombie_vars["zombie_health_start"]; if ( getdvarint( "scr_writeConfigStrings" ) == 1 ) { wait 5; exitlevel(); return; } if ( level.zombie_vars["game_start_delay"] > 0 ) round_pause( level.zombie_vars["game_start_delay"] ); flag_set( "begin_spawning" ); if ( !isdefined( level.round_spawn_func ) ) level.round_spawn_func = ::round_spawning; if ( !isdefined( level.round_wait_func ) ) level.round_wait_func = ::round_wait; if ( !isdefined( level.round_think_func ) ) level.round_think_func = ::round_think; level thread [[ level.round_think_func ]](); } round_spawning() { level endon( "intermission" ); level endon( "end_of_round" ); level endon( "restart_round" ); if ( level.intermission ) return; if ( level.zombie_spawn_locations.size < 1 ) { return; } ai_calculate_health( level.round_number ); count = 0; players = get_players(); for ( i = 0; i < players.size; i++ ) players[i].zombification_time = 0; max = level.zombie_vars["zombie_max_ai"]; multiplier = level.round_number / 5; if ( multiplier < 1 ) multiplier = 1; if ( level.round_number >= 10 ) multiplier *= ( level.round_number * 0.15 ); player_num = get_players().size; max += int( ( player_num * 0.5 ) * level.zombie_vars["zombie_ai_per_player"] * multiplier ); if ( !isdefined( level.max_zombie_func ) ) level.max_zombie_func = ::default_max_zombie_func; if ( !( isdefined( level.kill_counter_hud ) && level.zombie_total > 0 ) ) { level.zombie_total = [[ level.max_zombie_func ]]( max ); level notify( "zombie_total_set" ); } if ( isdefined( level.zombie_total_set_func ) ) level thread [[ level.zombie_total_set_func ]](); if ( level.round_number < 10 || level.speed_change_max > 0 ) level thread zombie_speed_up(); mixed_spawns = 0; old_spawn = undefined; while ( true ) { while ( get_current_zombie_count() >= level.zombie_ai_limit || level.zombie_total <= 0 ) wait 0.1; while ( get_current_actor_count() >= level.zombie_actor_limit ) { clear_all_corpses(); wait 0.1; } flag_wait( "spawn_zombies" ); while ( level.zombie_spawn_locations.size <= 0 ) wait 0.1; run_custom_ai_spawn_checks(); spawn_point = level.zombie_spawn_locations[randomint( level.zombie_spawn_locations.size )]; if ( !isdefined( old_spawn ) ) old_spawn = spawn_point; else if ( spawn_point == old_spawn ) spawn_point = level.zombie_spawn_locations[randomint( level.zombie_spawn_locations.size )]; old_spawn = spawn_point; if ( isdefined( level.mixed_rounds_enabled ) && level.mixed_rounds_enabled == 1 ) { spawn_dog = 0; if ( level.round_number > 30 ) { if ( randomint( 100 ) < 3 ) spawn_dog = 1; } else if ( level.round_number > 25 && mixed_spawns < 3 ) { if ( randomint( 100 ) < 2 ) spawn_dog = 1; } else if ( level.round_number > 20 && mixed_spawns < 2 ) { if ( randomint( 100 ) < 2 ) spawn_dog = 1; } else if ( level.round_number > 15 && mixed_spawns < 1 ) { if ( randomint( 100 ) < 1 ) spawn_dog = 1; } if ( spawn_dog ) { keys = getarraykeys( level.zones ); for ( i = 0; i < keys.size; i++ ) { if ( level.zones[keys[i]].is_occupied ) { akeys = getarraykeys( level.zones[keys[i]].adjacent_zones ); for ( k = 0; k < akeys.size; k++ ) { if ( level.zones[akeys[k]].is_active && !level.zones[akeys[k]].is_occupied && level.zones[akeys[k]].dog_locations.size > 0 ) { maps\mp\zombies\_zm_ai_dogs::special_dog_spawn( undefined, 1 ); level.zombie_total--; wait_network_frame(); } } } } } } if ( isdefined( level.zombie_spawners ) ) { if ( isdefined( level.use_multiple_spawns ) && level.use_multiple_spawns ) { if ( isdefined( spawn_point.script_int ) ) { if ( isdefined( level.zombie_spawn[spawn_point.script_int] ) && level.zombie_spawn[spawn_point.script_int].size ) spawner = random( level.zombie_spawn[spawn_point.script_int] ); } else if ( isdefined( level.zones[spawn_point.zone_name].script_int ) && level.zones[spawn_point.zone_name].script_int ) spawner = random( level.zombie_spawn[level.zones[spawn_point.zone_name].script_int] ); else if ( isdefined( level.spawner_int ) && ( isdefined( level.zombie_spawn[level.spawner_int].size ) && level.zombie_spawn[level.spawner_int].size ) ) spawner = random( level.zombie_spawn[level.spawner_int] ); else spawner = random( level.zombie_spawners ); } else spawner = random( level.zombie_spawners ); ai = spawn_zombie( spawner, spawner.targetname, spawn_point ); } if ( isdefined( ai ) ) { level.zombie_total--; ai thread round_spawn_failsafe(); count++; } wait( level.zombie_vars["zombie_spawn_delay"] ); wait_network_frame(); } } round_spawn_failsafe() { self endon( "death" ); prevorigin = self.origin; prevorigin_time = gettime(); while ( true ) { if ( isdefined( self.ignore_round_spawn_failsafe ) && self.ignore_round_spawn_failsafe ) return; wait 0.05; if ( isdefined( self.is_inert ) && self.is_inert ) { prevorigin = self.origin; prevorigin_time = gettime(); continue; } if ( isdefined( self.in_the_ground ) && self.in_the_ground ) { prevorigin = self.origin; prevorigin_time = gettime(); continue; } if ( isdefined( self.in_the_ceiling ) && self.in_the_ceiling ) { prevorigin = self.origin; prevorigin_time = gettime(); continue; } if ( isdefined( self.lastchunk_destroy_time ) ) { if ( gettime() - self.lastchunk_destroy_time < 4000 ) { prevorigin = self.origin; prevorigin_time = gettime(); continue; } } if ( self.origin[2] < level.zombie_vars["below_world_check"] ) { if ( isdefined( level.put_timed_out_zombies_back_in_queue ) && level.put_timed_out_zombies_back_in_queue && !flag( "dog_round" ) && !( isdefined( self.isscreecher ) && self.isscreecher ) ) { level.zombie_total++; level.zombie_total_subtract++; } self dodamage( self.health + 100, ( 0, 0, 0 ) ); break; } if ( distancesquared( self.origin, prevorigin ) < 576 ) { if ( gettime() - prevorigin_time < 15000 ) continue; if ( isdefined( level.put_timed_out_zombies_back_in_queue ) && level.put_timed_out_zombies_back_in_queue && !flag( "dog_round" ) ) { if ( !self.ignoreall && !( isdefined( self.nuked ) && self.nuked ) && !( isdefined( self.marked_for_death ) && self.marked_for_death ) && !( isdefined( self.isscreecher ) && self.isscreecher ) && !( isdefined( self.is_brutus ) && self.is_brutus ) ) { level.zombie_total++; level.zombie_total_subtract++; if ( self.health < level.zombie_health ) level.zombie_respawned_health[level.zombie_respawned_health.size] = self.health; } } level.zombies_timeout_playspace++; if ( isdefined( self.is_brutus ) && self.is_brutus ) { self.suppress_brutus_powerup_drop = 1; self.brutus_round_spawn_failsafe = 1; } self dodamage( self.health + 100, ( 0, 0, 0 ) ); break; } else { prevorigin = self.origin; prevorigin_time = gettime(); } } } round_think( restart = 0 ) { level endon( "end_round_think" ); if ( !( isdefined( restart ) && restart ) ) { if ( isdefined( level.initial_round_wait_func ) ) [[ level.initial_round_wait_func ]](); if ( !( isdefined( level.host_ended_game ) && level.host_ended_game ) ) { players = get_players(); foreach ( player in players ) { if ( !( isdefined( player.hostmigrationcontrolsfrozen ) && player.hostmigrationcontrolsfrozen ) ) { player freezecontrols( 0 ); } player maps\mp\zombies\_zm_stats::set_global_stat( "rounds", level.round_number ); } } } setroundsplayed( level.round_number ); for (;;) { if (!is_gametype_active("zgrief")) { level.player_starting_points = (level.round_number + 1) * 500; if (level.player_starting_points > 10000) { level.player_starting_points = 10000; } } maxreward = 50 * level.round_number; if ( maxreward > 500 ) maxreward = 500; level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward; level.pro_tips_start_time = gettime(); level.zombie_last_run_time = gettime(); if ( isdefined( level.zombie_round_change_custom ) ) [[ level.zombie_round_change_custom ]](); else { level thread maps\mp\zombies\_zm_audio::change_zombie_music( "round_start" ); round_one_up(); } maps\mp\zombies\_zm_powerups::powerup_round_start(); players = get_players(); array_thread( players, maps\mp\zombies\_zm_blockers::rebuild_barrier_reward_reset ); if ( !( isdefined( level.headshots_only ) && level.headshots_only ) && !restart ) level thread award_grenades_for_survivors(); bbprint( "zombie_rounds", "round %d player_count %d", level.round_number, players.size ); level.round_start_time = gettime(); while ( level.zombie_spawn_locations.size <= 0 ) wait 0.1; level thread [[ level.round_spawn_func ]](); level notify( "start_of_round" ); recordzombieroundstart(); players = getplayers(); for ( index = 0; index < players.size; index++ ) { zonename = players[index] get_current_zone(); if ( isdefined( zonename ) ) players[index] recordzombiezone( "startingZone", zonename ); } if ( isdefined( level.round_start_custom_func ) ) [[ level.round_start_custom_func ]](); [[ level.round_wait_func ]](); level.first_round = 0; level notify( "end_of_round" ); level thread maps\mp\zombies\_zm_audio::change_zombie_music( "round_end" ); uploadstats(); if ( isdefined( level.round_end_custom_logic ) ) [[ level.round_end_custom_logic ]](); players = get_players(); if ( isdefined( level.no_end_game_check ) && level.no_end_game_check ) { level thread last_stand_revive(); level thread spectators_respawn(); } else if ( 1 != players.size ) level thread spectators_respawn(); players = get_players(); array_thread( players, maps\mp\zombies\_zm_pers_upgrades_system::round_end ); timer = level.zombie_vars["zombie_spawn_delay"]; if ( timer > 0.08 ) level.zombie_vars["zombie_spawn_delay"] = timer * 0.95; else if ( timer < 0.08 ) level.zombie_vars["zombie_spawn_delay"] = 0.08; if ( level.gamedifficulty == 0 ) level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier_easy"]; else level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier"]; level.round_number++; setroundsplayed( level.round_number + int(level.round_number / 256) ); matchutctime = getutc(); players = get_players(); foreach ( player in players ) { if ( level.curr_gametype_affects_rank && level.round_number > 3 + level.start_round ) player maps\mp\zombies\_zm_stats::add_client_stat( "weighted_rounds_played", level.round_number ); player maps\mp\zombies\_zm_stats::set_global_stat( "rounds", level.round_number ); player maps\mp\zombies\_zm_stats::update_playing_utc_time( matchutctime ); } check_quickrevive_for_hotjoin(); level round_over(); level notify( "between_round_over" ); restart = 0; } } spectators_respawn() { level endon( "between_round_over" ); if ( !isdefined( level.zombie_vars["spectators_respawn"] ) || !level.zombie_vars["spectators_respawn"] ) return; if ( !isdefined( level.custom_spawnplayer ) ) level.custom_spawnplayer = ::spectator_respawn; while ( true ) { players = get_players(); for ( i = 0; i < players.size; i++ ) { if ( players[i].sessionstate == "spectator" && isdefined( players[i].spectator_respawn ) ) { players[i] [[ level.spawnplayer ]](); thread refresh_player_navcard_hud(); new_score = (level.round_number + 1) * 250; if (new_score > 1500) { new_score = 1500; } if ( players[i].score < new_score ) { players[i].old_score = players[i].score; if ( isdefined( level.spectator_respawn_custom_score ) ) players[i] [[ level.spectator_respawn_custom_score ]](); players[i].score = new_score; } } } wait 1; } } ai_calculate_health( round_number ) { level.zombie_health = level.zombie_vars[ "zombie_health_start" ]; max_health = 100000; i = 2; while ( i <= round_number ) { if( level.zombie_health > max_health ) { level.zombie_health = max_health; return; } if ( i >= 10 ) { old_health = level.zombie_health; level.zombie_health = level.zombie_health + int( level.zombie_health * level.zombie_vars[ "zombie_health_increase_multiplier" ] ); if ( level.zombie_health < old_health ) { level.zombie_health = old_health; return; } i++; continue; } level.zombie_health = int( level.zombie_health + level.zombie_vars[ "zombie_health_increase" ] ); i++; } } onallplayersready() { timeout = gettime() + 5000; while ( getnumexpectedplayers() == 0 && gettime() < timeout ) wait 0.1; player_count_actual = 0; while ( getnumconnectedplayers() < getnumexpectedplayers() || player_count_actual != getnumexpectedplayers() ) { players = get_players(); player_count_actual = 0; for ( i = 0; i < players.size; i++ ) { players[i] freezecontrols( 1 ); if ( players[i].sessionstate == "playing" ) player_count_actual++; } wait 0.1; } setinitialplayersconnected(); if ( 1 == getnumconnectedplayers() && getdvarint( "scr_zm_enable_bots" ) == 1 ) { level thread add_bots(); flag_set( "initial_players_connected" ); } else { players = get_players(); if ( players.size == 1 && level.scr_zm_ui_gametype != "zgrief" ) { flag_set( "solo_game" ); level.solo_lives_given = 0; foreach ( player in players ) player.lives = 0; level maps\mp\zombies\_zm::set_default_laststand_pistol( 1 ); } flag_set( "initial_players_connected" ); while ( !aretexturesloaded() ) wait 0.05; thread start_zombie_logic_in_x_sec( 3.0 ); } setDvar("team_axis", ""); setDvar("team_allies", ""); fade_out_intro_screen_zm( 5.0, 1.5, 1 ); } fade_out_intro_screen_zm( hold_black_time, fade_out_time, destroyed_afterwards ) { flag_init( "hud_visible" ); if ( !isdefined( level.introscreen ) ) { level.introscreen = newhudelem(); level.introscreen.x = 0; level.introscreen.y = 0; level.introscreen.horzalign = "fullscreen"; level.introscreen.vertalign = "fullscreen"; level.introscreen.foreground = 0; level.introscreen setshader( "black", 640, 480 ); level.introscreen.immunetodemogamehudsettings = 1; level.introscreen.immunetodemofreecamera = 1; wait 0.05; } level.introscreen.alpha = 1; if ( isdefined( hold_black_time ) ) wait( hold_black_time ); else wait 0.2; if ( !isdefined( fade_out_time ) ) fade_out_time = 1.5; level.introscreen fadeovertime( fade_out_time ); level.introscreen.alpha = 0; wait 1.6; level.passed_introscreen = 1; players = get_players(); foreach (player in players) { player setclientuivisibilityflag( "hud_visible", 1 ); } flag_set( "hud_visible" ); if ( isDedicated() || ( is_gametype_active("zgrief") && getDvarInt("ui_gametype_team_change") ) ) { flag_init( "all_players_ready" ); level thread wait_for_all_players_ready(); flag_wait( "all_players_ready" ); } players = get_players(); for ( i = 0; i < players.size; i++ ) { if ( !( isdefined( level.host_ended_game ) && level.host_ended_game ) ) { if ( isdefined( level.player_movement_suppressed ) ) { players[i] freezecontrols( level.player_movement_suppressed ); continue; } if ( !( isdefined( players[i].hostmigrationcontrolsfrozen ) && players[i].hostmigrationcontrolsfrozen ) ) { players[i] freezecontrols( 0 ); } } } if ( destroyed_afterwards == 1 ) level.introscreen destroy(); flag_set( "initial_blackscreen_passed" ); } wait_for_all_players_ready() { if (!isDefined(level.prev_no_end_game_check)) { level.prev_no_end_game_check = is_true(level.no_end_game_check); } level.no_end_game_check = 1; if ( !isDefined(level.pregame_hud) ) { level.pregame_hud = createServerFontString( "objective", 1.5 ); level.pregame_hud setPoint( "CENTER", "CENTER", 0, -95 ); level.pregame_hud.color = ( 1, 1, 1 ); } num_players = get_number_of_waiting_players(); while ( num_players < level.pregame_minplayers ) { if (is_gametype_active("zgrief")) { level thread check_for_team_change(); } players = get_players(); foreach ( player in players ) { if ( is_true( player.afterlife ) ) { player.infinite_mana = 1; } player freezecontrols( 1 ); } num_waiting_for = level.pregame_minplayers - num_players; players_str = "PLAYERS"; if ( num_waiting_for == 1 ) { players_str = "PLAYER"; } level.pregame_hud setText( "WAITING FOR " + num_waiting_for + " MORE " + players_str + " [" + num_players + "/" + level.pregame_minplayers + "]" ); wait 0.05; num_players = get_number_of_waiting_players(); } if ( !isDefined(level.ready_up_hud) ) { level.ready_up_hud = createServerFontString( "objective", 1.5 ); level.ready_up_hud setPoint( "CENTER", "CENTER", 0, -115 ); level.ready_up_hud.color = ( 1, 1, 1 ); level.ready_up_hud setText( "PRESS ^3[{+gostand}]^7 OR ^3[{+activate}]^7 TO READY UP" ); } if ( isDedicated() && !(is_gametype_active("zgrief") && getDvarInt("ui_gametype_team_change")) ) { level.ready_up_time = 60; level.ready_up_start_time = getTime(); level.ready_up_start_players = get_players(); if (!isDefined(level.ready_up_timer_hud)) { level.ready_up_countdown_hud = countdown_hud("PRE-GAME ENDS IN", level.ready_up_time); } } level.ready_up_hud.alpha = 1; num_ready = get_number_of_ready_players(); players = get_players(); foreach ( player in players ) { player.waiting = undefined; player playlocalsound( "zmb_perks_packa_ready" ); player.playing_loop_sound = 1; player playloopsound( "zmb_perks_packa_ticktock" ); } while ( num_ready < players.size || players.size < level.pregame_minplayers ) { ready_up_timeout = 0; if ( isDefined(level.ready_up_time) ) { time = getTime() - level.ready_up_start_time; if ( time >= level.ready_up_time * 1000 ) { ready_up_timeout = 1; foreach ( player in level.ready_up_start_players ) { if ( isDefined(player) && !isDefined(player.ready) ) { kick(player getEntityNumber()); } } wait 0.05; } } players = get_players(); if ( players.size < level.pregame_minplayers ) { foreach ( player in players ) { player.ready = undefined; player.statusicon = ""; player playlocalsound( "zmb_perks_packa_deny" ); player.playing_loop_sound = undefined; player stoploopsound(); } level.ready_up_hud.alpha = 0; if (isDefined(level.ready_up_countdown_hud)) { level.ready_up_countdown_hud countdown_hud_destroy(); } level thread wait_for_all_players_ready(); return; } if (ready_up_timeout) { break; } if (is_gametype_active("zgrief")) { level thread check_for_team_change(); } foreach ( player in players ) { if ( !isDefined( player.playing_loop_sound ) ) { player.playing_loop_sound = 1; player playloopsound( "zmb_perks_packa_ticktock" ); } if ( is_true( player.afterlife ) ) { player.infinite_mana = 1; } player freezecontrols( 1 ); } num_waiting_for = players.size - num_ready; players_str = "PLAYERS"; if ( num_waiting_for == 1 ) { players_str = "PLAYER"; } level.pregame_hud setText( "WAITING FOR " + num_waiting_for + " " + players_str + " TO BE READY [" + num_ready + "/" + players.size + "]" ); wait 0.05; num_ready = get_number_of_ready_players(); players = get_players(); } if (is_gametype_active("zgrief")) { level thread check_for_team_change(); } foreach ( player in players ) { player.ready = undefined; player.statusicon = ""; player.playing_loop_sound = undefined; player stoploopsound(); if ( is_true( player.afterlife ) ) { player.infinite_mana = 0; } } level.ready_up_hud destroy(); level.pregame_hud destroy(); if (isDefined(level.ready_up_countdown_hud)) { level.ready_up_countdown_hud countdown_hud_destroy(); } level.no_end_game_check = level.prev_no_end_game_check; flag_set( "all_players_ready" ); } get_number_of_waiting_players() { num = 0; players = get_players(); for ( i = 0; i < players.size; i++ ) { if ( is_player_valid( players[i] ) || is_true( players[i].afterlife ) ) { players[i].waiting = 1; } if ( is_true( players[i].waiting ) ) { num++; } } return num; } get_number_of_ready_players() { num = 0; players = get_players(); for ( i = 0; i < players.size; i++ ) { if ( players[i] jumpbuttonpressed() || players[i] usebuttonpressed() || players[i] is_bot() ) { players[i].ready = 1; } if ( is_true( players[i].ready ) ) { num++; players[i].statusicon = "menu_mp_killstreak_select"; } else { players[i].statusicon = "menu_mp_contract_expired"; } } return num; } check_for_team_change() { if (level.allow_teamchange) { return; } team_change_player = undefined; axis_players = get_players("axis"); allies_players = get_players("allies"); if (axis_players.size - 1 > allies_players.size) { team_change_player = random(axis_players); } else if (allies_players.size - 1 > axis_players.size) { team_change_player = random(allies_players); } if (isDefined(team_change_player)) { team_change_player endon("disconnect"); team_change_player scripts\zm\replaced\_zm_gametype::do_team_change(); wait 0.05; team_change_player freezecontrols(1); } } countdown_hud(text, time) { countdown_hud = createServerFontString( "objective", 2.2 ); countdown_hud setPoint( "CENTER", "CENTER", 0, 0 ); countdown_hud.color = ( 1, 1, 0 ); countdown_hud maps\mp\gametypes_zm\_hud::fontpulseinit(); countdown_hud thread countdown_hud_end_game_watcher(); countdown_hud.countdown_text = createServerFontString( "objective", 1.5 ); countdown_hud.countdown_text setPoint( "CENTER", "CENTER", 0, -40 ); countdown_hud.countdown_text.color = ( 1, 1, 1 ); countdown_hud thread countdown_hud_timer(time); countdown_hud.countdown_text setText(text); countdown_hud.alpha = 1; countdown_hud.countdown_text.alpha = 1; return countdown_hud; } countdown_hud_destroy() { self.countdown_text destroy(); self destroy(); } countdown_hud_end_game_watcher() { self endon("death"); level waittill( "end_game" ); self countdown_hud_destroy(); } countdown_hud_timer(time) { self endon("death"); while(time > 0) { self setvalue(time); self thread maps\mp\gametypes_zm\_hud::fontpulse(level); wait 1; time--; } } last_stand_pistol_rank_init() { level.pistol_values = []; level.pistol_values[ level.pistol_values.size ] = "m1911_zm"; level.pistol_values[ level.pistol_values.size ] = "c96_zm"; level.pistol_values[ level.pistol_values.size ] = "cz75_zm"; level.pistol_values[ level.pistol_values.size ] = "cz75dw_zm"; level.pistol_values[ level.pistol_values.size ] = "kard_zm"; level.pistol_values[ level.pistol_values.size ] = "fiveseven_zm"; level.pistol_values[ level.pistol_values.size ] = "beretta93r_zm"; level.pistol_values[ level.pistol_values.size ] = "beretta93r_extclip_zm"; level.pistol_values[ level.pistol_values.size ] = "fivesevendw_zm"; level.pistol_values[ level.pistol_values.size ] = "rnma_zm"; level.pistol_values[ level.pistol_values.size ] = "python_zm"; level.pistol_values[ level.pistol_values.size ] = "judge_zm"; level.pistol_values[ level.pistol_values.size ] = "cz75_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "cz75dw_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "kard_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "fiveseven_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "beretta93r_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "beretta93r_extclip_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "fivesevendw_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "rnma_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "python_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "judge_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "ray_gun_zm"; level.pistol_values[ level.pistol_values.size ] = "ray_gun_upgraded_zm"; level.pistol_value_solo_replace_below = level.pistol_values.size - 1; level.pistol_values[ level.pistol_values.size ] = "m1911_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "c96_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "raygun_mark2_zm"; level.pistol_values[ level.pistol_values.size ] = "raygun_mark2_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "freezegun_zm"; level.pistol_values[ level.pistol_values.size ] = "freezegun_upgraded_zm"; level.pistol_values[ level.pistol_values.size ] = "microwavegundw_zm"; level.pistol_values[ level.pistol_values.size ] = "microwavegundw_upgraded_zm"; } last_stand_best_pistol() { pistol_array = []; current_weapons = self getweaponslistprimaries(); for ( i = 0; i < current_weapons.size; i++ ) { class = weaponclass( current_weapons[i] ); if ( issubstr( current_weapons[i], "knife_ballistic_" ) ) class = "knife"; if ( class == "pistol" || class == "pistolspread" || class == "pistol spread" ) { if ( current_weapons[i] != level.default_laststandpistol && !flag( "solo_game" ) || !flag( "solo_game" ) && current_weapons[i] != level.default_solo_laststandpistol ) { ammo_count = self getammocount( current_weapons[i] ); dual_wield_name = weapondualwieldweaponname( current_weapons[i] ); if ( dual_wield_name != "none" ) { ammo_count += self getweaponammoclip( dual_wield_name ); } if ( ammo_count <= 0 ) continue; } pistol_array_index = pistol_array.size; pistol_array[pistol_array_index] = spawnstruct(); pistol_array[pistol_array_index].gun = current_weapons[i]; pistol_array[pistol_array_index].value = 0; for ( j = 0; j < level.pistol_values.size; j++ ) { if ( level.pistol_values[j] == current_weapons[i] ) { pistol_array[pistol_array_index].value = j; break; } } } } self.laststandpistol = last_stand_compare_pistols( pistol_array ); } can_track_ammo( weap ) { if ( !isdefined( weap ) ) return false; switch ( weap ) { case "zombie_tazer_flourish": case "zombie_sickle_flourish": case "zombie_knuckle_crack": case "zombie_fists_zm": case "zombie_builder_zm": case "zombie_bowie_flourish": case "time_bomb_zm": case "time_bomb_detonator_zm": case "tazer_knuckles_zm": case "tazer_knuckles_upgraded_zm": case "slowgun_zm": case "slowgun_upgraded_zm": case "screecher_arms_zm": case "riotshield_zm": case "none": case "no_hands_zm": case "lower_equip_gasmask_zm": case "humangun_zm": case "humangun_upgraded_zm": case "equip_gasmask_zm": case "equip_dieseldrone_zm": case "death_throe_zm": case "chalk_draw_zm": case "alcatraz_shield_zm": case "tomb_shield_zm": return false; default: if ( is_melee_weapon( weap ) || is_zombie_perk_bottle( weap ) || is_placeable_mine( weap ) || is_equipment( weap ) || issubstr( weap, "knife_ballistic_" ) || getsubstr( weap, 0, 3 ) == "gl_" || weaponfuellife( weap ) > 0 || weap == level.revive_tool ) return false; } return true; } take_additionalprimaryweapon() { weapon_to_take = undefined; self.a_saved_weapon = undefined; if ( isdefined( self._retain_perks ) && self._retain_perks || isdefined( self._retain_perks_array ) && ( isdefined( self._retain_perks_array["specialty_additionalprimaryweapon"] ) && self._retain_perks_array["specialty_additionalprimaryweapon"] ) ) return weapon_to_take; primary_weapons_that_can_be_taken = []; primaryweapons = self getweaponslistprimaries(); for ( i = 0; i < primaryweapons.size; i++ ) { if ( maps\mp\zombies\_zm_weapons::is_weapon_included( primaryweapons[i] ) || maps\mp\zombies\_zm_weapons::is_weapon_upgraded( primaryweapons[i] ) ) primary_weapons_that_can_be_taken[primary_weapons_that_can_be_taken.size] = primaryweapons[i]; } pwtcbt = primary_weapons_that_can_be_taken.size; while ( pwtcbt >= 3 ) { weapon_to_take = primary_weapons_that_can_be_taken[pwtcbt - 1]; pwtcbt--; self.a_saved_weapon = maps\mp\zombies\_zm_weapons::get_player_weapondata(self, weapon_to_take); name = self.a_saved_weapon["name"]; dw_name = weaponDualWieldWeaponName(name); alt_name = weaponAltWeaponName(name); clip_missing = weaponClipSize(name) - self.a_saved_weapon["clip"]; if (clip_missing > self.a_saved_weapon["stock"]) { clip_missing = self.a_saved_weapon["stock"]; } self.a_saved_weapon["clip"] += clip_missing; self.a_saved_weapon["stock"] -= clip_missing; if (dw_name != "none") { clip_dualwield_missing = weaponClipSize(dw_name) - self.a_saved_weapon["lh_clip"]; if (clip_dualwield_missing > self.a_saved_weapon["stock"]) { clip_dualwield_missing = self.a_saved_weapon["stock"]; } self.a_saved_weapon["lh_clip"] += clip_dualwield_missing; self.a_saved_weapon["stock"] -= clip_dualwield_missing; } if (alt_name != "none") { clip_alt_missing = weaponClipSize(alt_name) - self.a_saved_weapon["alt_clip"]; if (clip_alt_missing > self.a_saved_weapon["alt_stock"]) { clip_alt_missing = self.a_saved_weapon["alt_stock"]; } self.a_saved_weapon["alt_clip"] += clip_alt_missing; self.a_saved_weapon["alt_stock"] -= clip_alt_missing; } if ( weapon_to_take == self getcurrentweapon() ) self switchtoweapon( primary_weapons_that_can_be_taken[0] ); self takeweapon( weapon_to_take ); } return weapon_to_take; } restore_additionalprimaryweapon() { if (!isDefined(self.a_saved_weapon)) { return; } pap_triggers = getentarray( "specialty_weapupgrade", "script_noteworthy" ); if (!additionalprimaryweapon_canplayerreceiveweapon(self, self.a_saved_weapon["name"], pap_triggers)) { self.a_saved_weapon = undefined; return; } current = get_player_weapon_with_same_base( self.a_saved_weapon["name"] ); if ( isdefined( current ) ) { curweapondata = get_player_weapondata( self, current ); self takeweapon( current ); weapondata = merge_weapons( curweapondata, weapondata ); } name = self.a_saved_weapon["name"]; dw_name = weapondualwieldweaponname( name ); alt_name = weaponaltweaponname( name ); if ( !is_weapon_upgraded( name ) ) self giveweapon( name ); else self giveweapon( name, 0, self get_pack_a_punch_weapon_options( name ) ); if ( name != "none" ) { self setweaponammoclip( name, self.a_saved_weapon["clip"] ); self setweaponammostock( name, self.a_saved_weapon["stock"] ); if ( isdefined( self.a_saved_weapon["fuel"] ) ) self setweaponammofuel( name, self.a_saved_weapon["fuel"] ); if ( isdefined( self.a_saved_weapon["heat"] ) && isdefined( self.a_saved_weapon["overheat"] ) ) self setweaponoverheating( self.a_saved_weapon["overheat"], self.a_saved_weapon["heat"], name ); } if ( dw_name != "none" ) self setweaponammoclip( dw_name, self.a_saved_weapon["lh_clip"] ); if ( alt_name != "none" ) { self setweaponammoclip( alt_name, self.a_saved_weapon["alt_clip"] ); self setweaponammostock( alt_name, self.a_saved_weapon["alt_stock"] ); } self switchtoweapon( name ); self.a_saved_weapon = undefined; } additionalprimaryweapon_canplayerreceiveweapon( player, weapon, pap_triggers ) { if ( isDefined( player ) && player maps\mp\zombies\_zm_weapons::has_weapon_or_upgrade( weapon ) ) { return 0; } if ( !maps\mp\zombies\_zm_weapons::limited_weapon_below_quota( weapon, player, pap_triggers ) ) { return 0; } if ( !player maps\mp\zombies\_zm_weapons::player_can_use_content( weapon ) ) { return 0; } if ( isDefined( level.custom_magic_box_selection_logic ) ) { if ( !( [[ level.custom_magic_box_selection_logic ]]( weapon, player, pap_triggers ) ) ) { return 0; } } if ( isDefined( player ) && isDefined( level.special_weapon_magicbox_check ) ) { if ( !player [[ level.special_weapon_magicbox_check ]]( weapon ) ) { return 0; } } if ( isSubStr( weapon, "staff" ) ) { return 0; } return 1; } actor_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) { if ( is_true( self.is_sloth ) ) { return 0; } if ( !isDefined( self ) || !isDefined( attacker ) ) { return damage; } if ( weapon == "tazer_knuckles_zm" || weapon == "jetgun_zm" ) { self.knuckles_extinguish_flames = 1; } else if ( weapon != "none" ) { self.knuckles_extinguish_flames = undefined; } if ( isDefined( attacker.animname ) && attacker.animname == "quad_zombie" ) { if ( isDefined( self.animname ) && self.animname == "quad_zombie" ) { return 0; } } if ( !isplayer( attacker ) && isDefined( self.non_attacker_func ) ) { if ( is_true( self.non_attack_func_takes_attacker ) ) { return self [[ self.non_attacker_func ]]( damage, weapon, attacker ); } else { return self [[ self.non_attacker_func ]]( damage, weapon ); } } if ( weapon == "zombie_bullet_crouch_zm" && meansofdeath == "MOD_RIFLE_BULLET" ) { damage_scalar = damage / 600; min_damage = int( damage_scalar * level.zombie_health ) + 1; if ( damage < min_damage ) { damage = min_damage; } } if ( weapon == "quadrotorturret_zm" && meansofdeath == "MOD_PISTOL_BULLET" ) { if (!is_true(self.is_mechz)) { damage_scalar = damage / 6000; min_damage = int( damage_scalar * level.zombie_health ) + 1; if ( damage < min_damage ) { damage = min_damage; } } } if ( weapon == "tower_trap_zm" ) { if (!is_true(self.is_brutus)) { damage = level.zombie_health; } } if ( weapon == "tower_trap_upgraded_zm" ) { if (!is_true(self.is_brutus)) { damage_scalar = damage / 200; min_damage = int(damage_scalar * level.zombie_health) + 1; if (damage < min_damage) { damage = min_damage; } } } if ( !isplayer( attacker ) && !isplayer( self ) ) { return damage; } if ( !isDefined( damage ) || !isDefined( meansofdeath ) ) { return damage; } if ( meansofdeath == "" ) { return damage; } old_damage = damage; final_damage = damage; if ( isDefined( self.actor_damage_func ) ) { final_damage = [[ self.actor_damage_func ]]( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); } if ( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) { attacker = attacker.owner; } if ( is_true( self.in_water ) ) { if ( int( final_damage ) >= self.health ) { self.water_damage = 1; } } attacker thread maps\mp\gametypes_zm\_weapons::checkhit( weapon ); if(maps\mp\zombies\_zm_weapons::get_base_weapon_name(weapon, 1) == "saritch_zm") { final_damage *= 2; } if(weapon == "ray_gun_zm" && meansofdeath == "MOD_PROJECTILE") { final_damage = 1500; } if(weapon == "ray_gun_upgraded_zm" && meansofdeath == "MOD_PROJECTILE") { final_damage = 2000; } if(weapon == "blundergat_zm" || weapon == "blundergat_upgraded_zm") { if(!is_true(self.is_brutus)) { damage_scalar = final_damage / 1000; min_damage = int(damage_scalar * level.zombie_health) + 1; if(final_damage < min_damage) { final_damage = min_damage; } } } if(weapon == "blundersplat_explosive_dart_zm") { if(!is_true(self.is_brutus)) { damage_scalar = final_damage / 3000; min_damage = int(damage_scalar * level.zombie_health) + 1; if(final_damage < min_damage) { final_damage = min_damage; } } } if (weapon == "staff_revive_zm") { if (!is_true(self.is_mechz)) { final_damage = level.zombie_health; } } if(attacker HasPerk("specialty_rof")) { if(meansofdeath == "MOD_PISTOL_BULLET" || meansofdeath == "MOD_RIFLE_BULLET") { final_damage *= 1.5; } } if(attacker HasPerk("specialty_deadshot")) { if(is_headshot(weapon, shitloc, meansofdeath)) { if(meansofdeath == "MOD_PISTOL_BULLET" || meansofdeath == "MOD_RIFLE_BULLET") { if(!isSubStr(weaponClass(weapon), "spread") || maps\mp\zombies\_zm_weapons::get_base_weapon_name(weapon, 1) == "ksg_zm") { final_damage *= 2; } } } } if ( attacker maps\mp\zombies\_zm_pers_upgrades_functions::pers_mulit_kill_headshot_active() && is_headshot( weapon, shitloc, meansofdeath ) ) { final_damage *= 2; } if(is_true(level.zombie_vars[attacker.team]["zombie_half_damage"]) && !is_true(self.marked_for_death)) { final_damage /= 2; } if ( is_true( level.headshots_only ) && isDefined( attacker ) && isplayer( attacker ) ) { if ( meansofdeath == "MOD_MELEE" && shitloc == "head" || meansofdeath == "MOD_MELEE" && shitloc == "helmet" ) { return int( final_damage ); } if ( is_explosive_damage( meansofdeath ) ) { return int( final_damage ); } else if ( !is_headshot( weapon, shitloc, meansofdeath ) ) { return 0; } } return int( final_damage ); } callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) { if ( isDefined( eattacker ) && isplayer( eattacker ) && eattacker.sessionteam == self.sessionteam && !eattacker hasperk( "specialty_noname" ) && isDefined( self.is_zombie ) && !self.is_zombie ) { self maps\mp\zombies\_zm::process_friendly_fire_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); if ( self != eattacker ) { return; } else if ( smeansofdeath != "MOD_GRENADE_SPLASH" && smeansofdeath != "MOD_GRENADE" && smeansofdeath != "MOD_EXPLOSIVE" && smeansofdeath != "MOD_PROJECTILE" && smeansofdeath != "MOD_PROJECTILE_SPLASH" && smeansofdeath != "MOD_BURNED" && smeansofdeath != "MOD_SUICIDE" ) { return; } } if ( is_true( level.pers_upgrade_insta_kill ) ) { self maps\mp\zombies\_zm_pers_upgrades_functions::pers_insta_kill_melee_swipe( smeansofdeath, eattacker ); } if ( isDefined( self.overrideplayerdamage ) ) { idamage = self [[ self.overrideplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); } else if ( isDefined( level.overrideplayerdamage ) ) { idamage = self [[ level.overrideplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); } if ( is_true( self.magic_bullet_shield ) ) { maxhealth = self.maxhealth; self.health += idamage; self.maxhealth = maxhealth; } if ( isDefined( self.divetoprone ) && self.divetoprone == 1 ) { if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) { dist = distance2d( vpoint, self.origin ); if ( dist > 32 ) { dot_product = vectordot( anglesToForward( self.angles ), vdir ); if ( dot_product > 0 ) { idamage = int( idamage * 0.5 ); } } } } if ( isDefined( level.prevent_player_damage ) ) { if ( self [[ level.prevent_player_damage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) ) { return; } } idflags |= level.idflags_no_knockback; if ( idamage > 0 && shitloc == "riotshield" ) { shitloc = "torso_upper"; } self maps\mp\zombies\_zm::finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); } getfreespawnpoint( spawnpoints, player ) { if ( !isDefined( spawnpoints ) ) { return undefined; } spawnpoints = array_randomize( spawnpoints ); if ( !isDefined( game[ "spawns_randomized" ] ) ) { game[ "spawns_randomized" ] = 1; random_chance = randomint( 100 ); if ( random_chance > 50 ) { set_game_var( "side_selection", 1 ); } else { set_game_var( "side_selection", 2 ); } } side_selection = get_game_var( "side_selection" ); if ( get_game_var( "switchedsides" ) ) { if ( side_selection == 2 ) { side_selection = 1; } else { if ( side_selection == 1 ) { side_selection = 2; } } } if ( isdefined( player ) && isdefined( player.team ) ) { i = 0; while ( isdefined( spawnpoints ) && i < spawnpoints.size ) { if ( side_selection == 1 ) { if ( player.team != "allies" && isdefined( spawnpoints[ i ].script_int ) && spawnpoints[ i ].script_int == 1 ) { arrayremovevalue( spawnpoints, spawnpoints[ i ] ); i = 0; } else if ( player.team == "allies" && isdefined( spawnpoints[ i ].script_int) && spawnpoints[ i ].script_int == 2 ) { arrayremovevalue( spawnpoints, spawnpoints[ i ] ); i = 0; } else { i++; } } else { if ( player.team == "allies" && isdefined( spawnpoints[ i ].script_int ) && spawnpoints[ i ].script_int == 1 ) { arrayremovevalue(spawnpoints, spawnpoints[i]); i = 0; } else if ( player.team != "allies" && isdefined( spawnpoints[ i ].script_int ) && spawnpoints[ i ].script_int == 2 ) { arrayremovevalue( spawnpoints, spawnpoints[ i ] ); i = 0; } else { i++; } } } } if ( !isdefined( self.playernum ) ) { num = 0; players = get_players(self.team); for(num = 0; num < 4; num++) { valid_num = true; foreach(player in players) { if(player != self && isdefined(player.playernum) && player.playernum == num) { valid_num = false; break; } } if(valid_num) { break; } } self.playernum = num; } for ( j = 0; j < spawnpoints.size; j++ ) { if ( !isdefined( game[ self.team + "_spawnpoints_randomized" ] ) ) { game[ self.team + "_spawnpoints_randomized" ] = 1; for ( m = 0; m < spawnpoints.size; m++ ) { spawnpoints[ m ].en_num = m; } } if ( spawnpoints[ j ].en_num == self.playernum ) { return spawnpoints[ j ]; } } return spawnpoints[ 0 ]; } check_for_valid_spawn_near_team( revivee, return_struct ) { if ( isDefined( level.check_for_valid_spawn_near_team_callback ) ) { spawn_location = [[ level.check_for_valid_spawn_near_team_callback ]]( revivee, return_struct ); return spawn_location; } players = array_randomize(get_players()); spawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); closest_group = undefined; closest_distance = 100000000; backup_group = undefined; backup_distance = 100000000; if ( spawn_points.size == 0 ) { return undefined; } for ( i = 0; i < players.size; i++ ) { if ( maps\mp\zombies\_zm_utility::is_player_valid( players[ i ], undefined, 1 ) && players[ i ] != self ) { for ( j = 0; j < spawn_points.size; j++ ) { if ( isdefined( spawn_points[ j ].script_int ) ) { ideal_distance = spawn_points[ j ].script_int; } else { ideal_distance = 1000; } if ( spawn_points[ j ].locked == 0 ) { plyr_dist = distancesquared( players[ i ].origin, spawn_points[ j ].origin ); if ( plyr_dist < ideal_distance * ideal_distance ) { if ( plyr_dist < closest_distance ) { closest_distance = plyr_dist; closest_group = j; } } else { if ( plyr_dist < backup_distance ) { backup_group = j; backup_distance = plyr_dist; } } } } } if ( !isdefined( closest_group ) ) { closest_group = backup_group; } if ( isdefined( closest_group ) ) { spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); if ( isdefined( spawn_location ) ) { return spawn_location; } } } if ( !is_true( self.player_initialized ) ) { return undefined; } for ( j = 0; j < spawn_points.size; j++ ) { if ( isdefined( spawn_points[ j ].script_int ) ) { ideal_distance = spawn_points[ j ].script_int; } else { ideal_distance = 1000; } if ( spawn_points[ j ].locked == 0 ) { plyr_dist = distancesquared( self.origin, spawn_points[ j ].origin ); if ( plyr_dist < ideal_distance * ideal_distance ) { if ( plyr_dist < closest_distance ) { closest_distance = plyr_dist; closest_group = j; } } else { if ( plyr_dist < backup_distance ) { backup_group = j; backup_distance = plyr_dist; } } } } if ( !isdefined( closest_group ) ) { closest_group = backup_group; } if ( isdefined( closest_group ) ) { spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); if ( isdefined( spawn_location ) ) { return spawn_location; } } return undefined; } get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ) { spawn_array = getstructarray( spawn_points[ closest_group ].target, "targetname" ); spawn_array = array_randomize( spawn_array ); k = 0; while ( k < spawn_array.size ) { if ( positionwouldtelefrag( spawn_array[ k ].origin ) ) { k++; continue; } if ( is_true( return_struct ) ) { return spawn_array[ k ]; } return spawn_array[ k ].origin; } if ( is_true( return_struct ) ) { return spawn_array[ 0 ]; } return spawn_array[ 0 ].origin; } player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) { if ( isDefined( level._game_module_player_damage_callback ) ) { new_damage = self [[ level._game_module_player_damage_callback ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); if (isDefined(new_damage)) { idamage = new_damage; } } idamage = self maps\mp\zombies\_zm::check_player_damage_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); if ( is_true( self.use_adjusted_grenade_damage ) ) { self.use_adjusted_grenade_damage = undefined; if ( self.health > idamage ) { return idamage; } } if ( !idamage ) { return 0; } if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) { return 0; } if ( isDefined( einflictor ) ) { if ( is_true( einflictor.water_damage ) ) { return 0; } } if ( isDefined( eattacker ) && is_true( eattacker.is_zombie ) || isplayer( eattacker ) ) { if ( is_true( self.hasriotshield ) && isDefined( vdir ) ) { if ( is_true( self.hasriotshieldequipped ) ) { if ( self maps\mp\zombies\_zm::player_shield_facing_attacker( vdir, 0.2 ) && isDefined( self.player_shield_apply_damage ) ) { self [[ self.player_shield_apply_damage ]]( 100, 0 ); return 0; } } else if ( !isDefined( self.riotshieldentity ) ) { if ( !self maps\mp\zombies\_zm::player_shield_facing_attacker( vdir, -0.2 ) && isDefined( self.player_shield_apply_damage ) ) { self [[ self.player_shield_apply_damage ]]( 100, 0 ); return 0; } } } } if ( isDefined( eattacker ) ) { if ( isDefined( self.ignoreattacker ) && self.ignoreattacker == eattacker ) { return 0; } if ( is_true( self.is_zombie ) && is_true( eattacker.is_zombie ) ) { return 0; } if ( is_true( eattacker.is_zombie ) ) { self.ignoreattacker = eattacker; self thread maps\mp\zombies\_zm::remove_ignore_attacker(); if ( isDefined( eattacker.custom_damage_func ) ) { idamage = eattacker [[ eattacker.custom_damage_func ]]( self ); } else if ( isDefined( eattacker.meleedamage ) ) { idamage = eattacker.meleedamage; } else { idamage = 50; } } eattacker notify( "hit_player" ); if ( smeansofdeath != "MOD_FALLING" ) { self thread maps\mp\zombies\_zm::playswipesound( smeansofdeath, eattacker ); if ( is_true( eattacker.is_zombie ) || isplayer( eattacker ) ) { self playrumbleonentity( "damage_heavy" ); } canexert = 1; if ( is_true( level.pers_upgrade_flopper ) ) { if ( is_true( self.pers_upgrades_awarded[ "flopper" ] ) ) { if ( smeansofdeath != "MOD_PROJECTILE_SPLASH" && smeansofdeath != "MOD_GRENADE" && smeansofdeath != "MOD_GRENADE_SPLASH" ) { canexert = smeansofdeath; } } } if ( is_true( canexert ) ) { if ( randomintrange( 0, 1 ) == 0 ) { self thread maps\mp\zombies\_zm_audio::playerexert( "hitmed" ); } else { self thread maps\mp\zombies\_zm_audio::playerexert( "hitlrg" ); } } } } finaldamage = idamage; if ( is_placeable_mine( sweapon ) || sweapon == "freezegun_zm" || sweapon == "freezegun_upgraded_zm" ) { return 0; } // fix turrets damaging players if(sweapon == "zombie_bullet_crouch_zm" && smeansofdeath == "MOD_RIFLE_BULLET") { return 0; } if ( isDefined( self.player_damage_override ) ) { self thread [[ self.player_damage_override ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); } if ( smeansofdeath == "MOD_FALLING" ) { if ( self hasperk( "specialty_flakjacket" ) && isDefined( self.divetoprone ) && self.divetoprone == 1 ) { if ( isDefined( level.zombiemode_divetonuke_perk_func ) ) { [[ level.zombiemode_divetonuke_perk_func ]]( self, self.origin ); } return 0; } if ( is_true( level.pers_upgrade_flopper ) ) { if ( self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_flopper_damage_check( smeansofdeath, idamage ) ) { return 0; } } vars = []; if (!self hasPerk("specialty_flakjacket")) { // remove fall damage being based off max health vars["ratio"] = self.maxhealth / 100; idamage = int(idamage / vars["ratio"]); // increase fall damage beyond 110 vars["max_damage"] = 110; if (idamage >= vars["max_damage"]) { vars["velocity"] = abs(self.fall_velocity); vars["min_velocity"] = getDvarInt("bg_fallDamageMinHeight") * 3.25; vars["max_velocity"] = getDvarInt("bg_fallDamageMaxHeight") * 2.5; if (self.divetoprone) { vars["min_velocity"] = getDvarInt("dtp_fall_damage_min_height") * 4.5; vars["max_velocity"] = getDvarInt("dtp_fall_damage_max_height") * 2.75; } idamage = int(((vars["velocity"] - vars["min_velocity"]) / (vars["max_velocity"] - vars["min_velocity"])) * vars["max_damage"]); if (idamage < vars["max_damage"]) { idamage = vars["max_damage"]; } } finaldamage = idamage; } } if ( smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE" || smeansofdeath == "MOD_GRENADE_SPLASH" ) { if ( self hasperk( "specialty_flakjacket" ) ) { return 0; } if ( is_true( level.pers_upgrade_flopper ) ) { if ( is_true( self.pers_upgrades_awarded[ "flopper" ] ) ) { return 0; } } if ( sweapon == "slip_bolt_zm" || sweapon == "slip_bolt_upgraded_zm" ) { return 0; } if ( self.health > 75 && !is_true( self.is_zombie ) ) { return 75; } } if ( idamage < self.health ) { if ( isDefined( eattacker ) ) { if ( isDefined( level.custom_kill_damaged_vo ) ) { eattacker thread [[ level.custom_kill_damaged_vo ]]( self ); } else { eattacker.sound_damage_player = self; } if ( !is_true( eattacker.has_legs ) ) { self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "crawl_hit" ); } else if ( isDefined( eattacker.animname ) && eattacker.animname == "monkey_zombie" ) { self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "monkey_hit" ); } } return finaldamage; } if ( isDefined( eattacker ) ) { if ( isDefined( eattacker.animname ) && eattacker.animname == "zombie_dog" ) { self maps\mp\zombies\_zm_stats::increment_client_stat( "killed_by_zdog" ); self maps\mp\zombies\_zm_stats::increment_player_stat( "killed_by_zdog" ); } else if ( isDefined( eattacker.is_avogadro ) && eattacker.is_avogadro ) { self maps\mp\zombies\_zm_stats::increment_client_stat( "killed_by_avogadro", 0 ); self maps\mp\zombies\_zm_stats::increment_player_stat( "killed_by_avogadro" ); } } self thread maps\mp\zombies\_zm::clear_path_timers(); if ( level.intermission ) { level waittill( "forever" ); } if ( level.scr_zm_ui_gametype == "zcleansed" && idamage > 0 ) { if ( (!is_true( self.laststand ) && !self maps\mp\zombies\_zm_laststand::player_is_in_laststand()) || !isDefined( self.last_player_attacker ) ) { if(isDefined( eattacker ) && isplayer( eattacker ) && eattacker.team != self.team) { if ( isDefined( eattacker.maxhealth ) && is_true( eattacker.is_zombie ) ) { eattacker.health = eattacker.maxhealth; } if ( isDefined( level.player_kills_player ) ) { self thread [[ level.player_kills_player ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); } } } } if ( self hasperk( "specialty_finalstand" ) ) { if ( isDefined( level.chugabud_laststand_func ) ) { self thread [[ level.chugabud_laststand_func ]](); return 0; } } players = get_players(); count = 0; for ( i = 0; i < players.size; i++ ) { if ( players[ i ] == self || players[ i ].is_zombie || players[ i ] maps\mp\zombies\_zm_laststand::player_is_in_laststand() || players[ i ].sessionstate == "spectator" ) { count++; } } if ( count < players.size || isDefined( level._game_module_game_end_check ) && ![[ level._game_module_game_end_check ]]() ) { if ( isDefined( self.solo_lives_given ) && self.solo_lives_given < 3 && is_true( level.force_solo_quick_revive ) && self hasperk( "specialty_quickrevive" ) ) { self thread maps\mp\zombies\_zm::wait_and_revive(); } return finaldamage; } solo_death = self is_solo_death( players ); non_solo_death = self is_non_solo_death( players, count ); if ( ( solo_death || non_solo_death ) && !is_true( level.no_end_game_check ) ) { level notify( "stop_suicide_trigger" ); self thread scripts\zm\replaced\_zm_laststand::playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ); if ( !isDefined( vdir ) ) { vdir = ( 1, 0, 0 ); } self fakedamagefrom( vdir ); if ( isDefined( level.custom_player_fake_death ) ) { self thread [[ level.custom_player_fake_death ]]( vdir, smeansofdeath ); } else { self thread maps\mp\zombies\_zm::player_fake_death(); } } if ( count == players.size && !is_true( level.no_end_game_check ) ) { if ( players.size == 1 && flag( "solo_game" ) ) { if ( solo_death ) { self.lives = 0; level notify( "pre_end_game" ); wait_network_frame(); if ( flag( "dog_round" ) ) { maps\mp\zombies\_zm::increment_dog_round_stat( "lost" ); } level notify( "end_game" ); } else { return finaldamage; } } else { level notify( "pre_end_game" ); wait_network_frame(); if ( flag( "dog_round" ) ) { maps\mp\zombies\_zm::increment_dog_round_stat( "lost" ); } level notify( "end_game" ); } return 0; } else { surface = "flesh"; return finaldamage; } } is_solo_death( players ) { if ( players.size == 1 && flag( "solo_game" ) ) { if(self.solo_lives_given >= 3) { return 1; } if(isDefined(self.e_chugabud_corpse)) { return 0; } active_perks = 0; if(isDefined(self.perks_active)) { active_perks = self.perks_active.size; } disabled_perks = 0; if(isDefined(self.disabled_perks)) { disabled_perks = self.disabled_perks.size; } if(active_perks <= disabled_perks) { return 1; } } return 0; } is_non_solo_death( players, count ) { if ( count > 1 || players.size == 1 && !flag( "solo_game" ) ) { return 1; } return 0; } player_laststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { b_alt_visionset = 0; self allowjump( 0 ); currweapon = self getcurrentweapon(); statweapon = currweapon; if ( is_alt_weapon( statweapon ) ) { statweapon = weaponaltweaponname( statweapon ); } self addweaponstat( statweapon, "deathsDuringUse", 1 ); if ( is_true( self.hasperkspecialtytombstone ) ) { self.laststand_perks = scripts\zm\_zm_reimagined::tombstone_save_perks( self ); } if ( isDefined( self.pers_upgrades_awarded[ "perk_lose" ] ) && self.pers_upgrades_awarded[ "perk_lose" ] ) { self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_save(); } players = get_players(); if ( players.size == 1 && flag( "solo_game" ) ) { if ( self.solo_lives_given < 3 ) { active_perks = 0; if(isDefined(self.perks_active)) { active_perks = self.perks_active.size; } disabled_perks = 0; if(isDefined(self.disabled_perks)) { disabled_perks = self.disabled_perks.size; } if(active_perks > disabled_perks || isDefined(self.e_chugabud_corpse)) { self thread maps\mp\zombies\_zm::wait_and_revive(); } } } if ( self hasperk( "specialty_additionalprimaryweapon" ) ) { self.weapon_taken_by_losing_specialty_additionalprimaryweapon = maps\mp\zombies\_zm::take_additionalprimaryweapon(); } if ( is_true( self.hasperkspecialtytombstone ) ) { self [[ level.tombstone_laststand_func ]](); self thread [[ level.tombstone_spawn_func ]](); if (!is_true(self._retain_perks)) { self.hasperkspecialtytombstone = undefined; self notify( "specialty_scavenger_stop" ); } } self clear_is_drinking(); self thread maps\mp\zombies\_zm::remove_deadshot_bottle(); self thread maps\mp\zombies\_zm::remote_revive_watch(); self maps\mp\zombies\_zm_score::player_downed_penalty(); self disableoffhandweapons(); self thread maps\mp\zombies\_zm::last_stand_grenade_save_and_return(); if ( smeansofdeath != "MOD_SUICIDE" && smeansofdeath != "MOD_FALLING" ) { if ( !is_true( self.intermission ) ) { self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "revive_down" ); } else { if ( isDefined( level.custom_player_death_vo_func ) && !self [[ level.custom_player_death_vo_func ]]() ) { self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "exert_death" ); } } } bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "downed", self.origin ); if ( isDefined( level._zombie_minigun_powerup_last_stand_func ) ) { self thread [[ level._zombie_minigun_powerup_last_stand_func ]](); } if ( isDefined( level._zombie_tesla_powerup_last_stand_func ) ) { self thread [[ level._zombie_tesla_powerup_last_stand_func ]](); } if ( self hasperk( "specialty_grenadepulldeath" ) ) { b_alt_visionset = 1; if ( isDefined( level.custom_laststand_func ) ) { self thread [[ level.custom_laststand_func ]](); } } if ( is_true( self.intermission ) ) { bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "died", self.origin ); wait 0.5; self stopsounds(); level waittill( "forever" ); } if ( !b_alt_visionset ) { visionsetlaststand( "zombie_last_stand", 1 ); } } callback_playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { self endon( "disconnect" ); [[ scripts\zm\replaced\_zm_laststand::playerlaststand ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); } player_spawn_protection() { self endon("disconnect"); self endon("player_downed"); self endon("meat_grabbed"); self endon("meat_stink_player_start"); self thread player_spawn_protection_timeout(); self.spawn_protection = 1; for ( x = 0; x < 60; x++ ) { self.ignoreme = 1; wait 0.05; } if (!isDefined(level.meat_player)) { self.ignoreme = 0; } self.spawn_protection = 0; self notify("player_spawn_protection_end"); } player_spawn_protection_timeout() { self endon("disconnect"); self endon("player_spawn_protection_end"); self waittill_any("player_downed", "meat_grabbed", "meat_stink_player_start"); self.spawn_protection = 0; } wait_and_revive() { flag_set( "wait_and_revive" ); if ( isDefined( self.waiting_to_revive ) && self.waiting_to_revive == 1 ) { return; } if ( is_true( self.pers_upgrades_awarded[ "perk_lose" ] ) ) { self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_save(); } self.waiting_to_revive = 1; if ( isDefined( level.exit_level_func ) ) { self thread [[ level.exit_level_func ]](); } else if ( get_players().size == 1 ) { self thread maps\mp\zombies\_zm::default_exit_level(); } solo_revive_time = 10; self.revive_hud.y = -160; self.revive_hud settext( &"ZOMBIE_REVIVING" ); self maps\mp\zombies\_zm_laststand::revive_hud_show_n_fade( solo_revive_time ); if ( !isDefined( self.beingrevivedprogressbar ) ) { self.beingrevivedprogressbar = self createprimaryprogressbar(); self.beingrevivedprogressbar setpoint("CENTER", undefined, level.primaryprogressbarx, -1 * level.primaryprogressbary); self.beingrevivedprogressbar.bar.color = (0.5, 0.5, 1); self.beingrevivedprogressbar.hidewheninmenu = 1; self.beingrevivedprogressbar.bar.hidewheninmenu = 1; self.beingrevivedprogressbar.barframe.hidewheninmenu = 1; self.beingrevivedprogressbar.sort = 1; self.beingrevivedprogressbar.bar.sort = 2; self.beingrevivedprogressbar.barframe.sort = 3; self.beingrevivedprogressbar.barframe destroy(); } self.beingrevivedprogressbar updatebar( 0.01, 1 / solo_revive_time ); flag_wait_or_timeout( "instant_revive", solo_revive_time ); self.revive_hud settext( "" ); if ( isDefined( self.beingrevivedprogressbar ) ) { self.beingrevivedprogressbar destroyelem(); } flag_clear( "wait_and_revive" ); self maps\mp\zombies\_zm_laststand::auto_revive( self ); self.solo_lives_given++; self.waiting_to_revive = 0; if ( is_true( self.pers_upgrades_awarded[ "perk_lose" ] ) ) { self thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_restore(); } } player_revive_monitor() { self endon( "disconnect" ); self notify( "stop_player_revive_monitor" ); self endon( "stop_player_revive_monitor" ); while ( 1 ) { self waittill( "player_revived", reviver ); self playsoundtoplayer( "zmb_character_revived", self ); if ( isDefined( level.isresetting_grief ) && level.isresetting_grief ) { continue; } bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "revived", self.origin ); if ( isDefined( reviver ) ) { self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "revive_up" ); if(reviver != self) { points = self.score_lost_when_downed; reviver maps\mp\zombies\_zm_score::player_add_points( "reviver", points ); } self.score_lost_when_downed = 0; } } } player_out_of_playable_area_monitor() { self notify( "stop_player_out_of_playable_area_monitor" ); self endon( "stop_player_out_of_playable_area_monitor" ); self endon( "disconnect" ); level endon( "end_game" ); while ( !isdefined( self.characterindex ) ) wait 0.05; wait( 0.15 * self.characterindex ); while ( true ) { if ( self.sessionstate == "spectator" ) { wait( get_player_out_of_playable_area_monitor_wait_time() ); continue; } if ( is_true( level.hostmigration_occured ) ) { wait( get_player_out_of_playable_area_monitor_wait_time() ); continue; } if ( get_players().size == 1 && flag( "solo_game" ) && ( isdefined( self.waiting_to_revive ) && self.waiting_to_revive ) ) { wait( get_player_out_of_playable_area_monitor_wait_time() ); continue; } if ( !self in_life_brush() && ( self in_kill_brush() || !self in_enabled_playable_area() ) ) { if ( !isdefined( level.player_out_of_playable_area_monitor_callback ) || self [[ level.player_out_of_playable_area_monitor_callback ]]() ) { self maps\mp\zombies\_zm_stats::increment_map_cheat_stat( "cheat_out_of_playable" ); self maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_out_of_playable", 0 ); self maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_total", 0 ); self playlocalsound( level.zmb_laugh_alias ); wait 0.5; self.lives = 0; self dodamage( self.health + 1000, self.origin ); if (isDefined(level.player_suicide_func)) { wait 0.05; self thread [[level.player_suicide_func]](); } else { self.bleedout_time = 0; } } } wait( get_player_out_of_playable_area_monitor_wait_time() ); } } get_player_out_of_playable_area_monitor_wait_time() { return 1; } player_too_many_weapons_monitor() { self notify( "stop_player_too_many_weapons_monitor" ); self endon( "stop_player_too_many_weapons_monitor" ); self endon( "disconnect" ); level endon( "end_game" ); scalar = self.characterindex; if ( !isdefined( scalar ) ) scalar = self getentitynumber(); wait( 0.15 * scalar ); while ( true ) { if ( self has_powerup_weapon() || self maps\mp\zombies\_zm_laststand::player_is_in_laststand() || self.sessionstate == "spectator" ) { wait( get_player_too_many_weapons_monitor_wait_time() ); continue; } weapon_limit = get_player_weapon_limit( self ); primaryweapons = self getweaponslistprimaries(); if ( primaryweapons.size > weapon_limit ) { self maps\mp\zombies\_zm_weapons::take_fallback_weapon(); primaryweapons = self getweaponslistprimaries(); } primary_weapons_to_take = []; for ( i = 0; i < primaryweapons.size; i++ ) { if ( maps\mp\zombies\_zm_weapons::is_weapon_included( primaryweapons[i] ) || maps\mp\zombies\_zm_weapons::is_weapon_upgraded( primaryweapons[i] ) ) primary_weapons_to_take[primary_weapons_to_take.size] = primaryweapons[i]; } if ( primary_weapons_to_take.size > weapon_limit ) { if ( !isdefined( level.player_too_many_weapons_monitor_callback ) || self [[ level.player_too_many_weapons_monitor_callback ]]( primary_weapons_to_take ) ) { self maps\mp\zombies\_zm_stats::increment_map_cheat_stat( "cheat_too_many_weapons" ); self maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_too_many_weapons", 0 ); self maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_total", 0 ); self takeweapon( primary_weapons_to_take[ primary_weapons_to_take.size - 1 ] ); } } wait( get_player_too_many_weapons_monitor_wait_time() ); } } get_player_too_many_weapons_monitor_wait_time() { return 1; } end_game() { level waittill( "end_game" ); maps\mp\zombies\_zm::check_end_game_intermission_delay(); clientnotify( "zesn" ); if ( isDefined( level.sndgameovermusicoverride ) ) { level thread maps\mp\zombies\_zm_audio::change_zombie_music( level.sndgameovermusicoverride ); } else { level thread maps\mp\zombies\_zm_audio::change_zombie_music( "game_over" ); } players = get_players(); for ( i = 0; i < players.size; i++ ) { setclientsysstate( "lsm", "0", players[ i ] ); } for ( i = 0; i < players.size; i++ ) { players[ i ] enableInvulnerability(); if ( players[ i ] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) { players[ i ] recordplayerdeathzombies(); players[ i ] maps\mp\zombies\_zm_stats::increment_player_stat( "deaths" ); players[ i ] maps\mp\zombies\_zm_stats::increment_client_stat( "deaths" ); players[ i ] maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); } if ( isdefined( players[ i ].revivetexthud) ) { players[ i ].revivetexthud destroy(); } } stopallrumbles(); level.intermission = 1; level.zombie_vars[ "zombie_powerup_insta_kill_time" ] = 0; level.zombie_vars[ "zombie_powerup_fire_sale_time" ] = 0; level.zombie_vars[ "zombie_powerup_point_doubler_time" ] = 0; wait 0.1; game_over = []; survived = []; players = get_players(); if ( !isDefined( level._supress_survived_screen ) ) { for ( i = 0; i < players.size; i++ ) { if ( isDefined( level.custom_game_over_hud_elem ) ) { game_over[ i ] = [[ level.custom_game_over_hud_elem ]]( players[ i ] ); } else { game_over[ i ] = newclienthudelem( players[ i ] ); game_over[ i ].alignx = "center"; game_over[ i ].aligny = "middle"; game_over[ i ].horzalign = "center"; game_over[ i ].vertalign = "middle"; game_over[ i ].y -= 130; game_over[ i ].foreground = 1; game_over[ i ].fontscale = 3; game_over[ i ].alpha = 0; game_over[ i ].color = ( 1, 1, 1 ); game_over[ i ].hidewheninmenu = 1; game_over[ i ] settext( &"ZOMBIE_GAME_OVER" ); game_over[ i ] fadeovertime( 1 ); game_over[ i ].alpha = 1; } survived[ i ] = newclienthudelem( players[ i ] ); survived[ i ].alignx = "center"; survived[ i ].aligny = "middle"; survived[ i ].horzalign = "center"; survived[ i ].vertalign = "middle"; survived[ i ].y -= 100; survived[ i ].foreground = 1; survived[ i ].fontscale = 2; survived[ i ].alpha = 0; survived[ i ].color = ( 1, 1, 1 ); survived[ i ].hidewheninmenu = 1; if ( level.round_number < 2 ) { if ( level.script == "zombie_moon" ) { if ( !isDefined( level.left_nomans_land ) ) { nomanslandtime = level.nml_best_time; player_survival_time = int( nomanslandtime / 1000 ); player_survival_time_in_mins = maps\mp\zombies\_zm::to_mins( player_survival_time ); survived[ i ] settext( &"ZOMBIE_SURVIVED_NOMANS", player_survival_time_in_mins ); } else if ( level.left_nomans_land == 2 ) { survived[ i ] settext( &"ZOMBIE_SURVIVED_ROUND" ); } } else { survived[ i ] settext( &"ZOMBIE_SURVIVED_ROUND" ); } } else { survived[ i ] settext( &"ZOMBIE_SURVIVED_ROUNDS", level.round_number ); } survived[ i ] fadeovertime( 1 ); survived[ i ].alpha = 1; } } if ( isDefined( level.custom_end_screen ) ) { level [[ level.custom_end_screen ]](); } for ( i = 0; i < players.size; i++ ) { players[ i ] setclientammocounterhide( 1 ); players[ i ] setclientminiscoreboardhide( 1 ); } uploadstats(); maps\mp\zombies\_zm_stats::update_players_stats_at_match_end( players ); maps\mp\zombies\_zm_stats::update_global_counters_on_match_end(); wait 1; wait 3.95; players = get_players(); foreach ( player in players ) { if ( isdefined( player.sessionstate ) && player.sessionstate == "spectator" ) { player.sessionstate = "playing"; } } wait 0.05; players = get_players(); if ( !isDefined( level._supress_survived_screen ) ) { for(i = 0; i < players.size; i++) { survived[ i ] destroy(); game_over[ i ] destroy(); } } for ( i = 0; i < players.size; i++ ) { if ( isDefined( players[ i ].survived_hud ) ) { players[ i ].survived_hud destroy(); } if ( isDefined( players[ i ].game_over_hud ) ) { players[ i ].game_over_hud destroy(); } } maps\mp\zombies\_zm::intermission(); wait level.zombie_vars[ "zombie_intermission_time" ]; level notify( "stop_intermission" ); array_thread( get_players(), maps\mp\zombies\_zm::player_exit_level ); bbprint( "zombie_epilogs", "rounds %d", level.round_number ); wait 1.5; players = get_players(); for ( i = 0; i < players.size; i++ ) { players[ i ] cameraactivate( 0 ); } if (is_true(level.map_restart)) { map_restart(); } else { exitlevel(0); } wait 666; } check_quickrevive_for_hotjoin(disconnecting_player) { if ( level.scr_zm_ui_gametype == "zgrief" ) { return; } solo_mode = 0; subtract_num = 0; if ( isdefined( disconnecting_player ) ) subtract_num = 1; players = get_players(); if ( players.size - subtract_num == 1 ) { solo_mode = 1; flag_set( "solo_game" ); } else { flag_clear( "solo_game" ); } set_default_laststand_pistol( solo_mode ); }