mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-07 13:49:33 -05:00
3114 lines
74 KiB
Plaintext
3114 lines
74 KiB
Plaintext
#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;
|
|
|
|
init_fx()
|
|
{
|
|
if (level.script == "zm_buried" || level.script == "zm_prison")
|
|
{
|
|
level._uses_sticky_grenades = 1;
|
|
level.disable_fx_zmb_wall_buy_semtex = 0;
|
|
}
|
|
|
|
if (level.script == "zm_prison")
|
|
{
|
|
register_lethal_grenade_for_level("sticky_grenade_zm");
|
|
}
|
|
|
|
level.createfx_callback_thread = ::delete_in_createfx;
|
|
level._effect["wood_chunk_destory"] = loadfx("impacts/fx_large_woodhit");
|
|
level._effect["fx_zombie_bar_break"] = loadfx("maps/zombie/fx_zombie_bar_break");
|
|
level._effect["fx_zombie_bar_break_lite"] = loadfx("maps/zombie/fx_zombie_bar_break_lite");
|
|
|
|
if (!(isdefined(level.fx_exclude_edge_fog) && level.fx_exclude_edge_fog))
|
|
level._effect["edge_fog"] = loadfx("maps/zombie/fx_fog_zombie_amb");
|
|
|
|
level._effect["chest_light"] = loadfx("maps/zombie/fx_zmb_tranzit_marker_glow");
|
|
|
|
if (!(isdefined(level.fx_exclude_default_eye_glow) && level.fx_exclude_default_eye_glow))
|
|
level._effect["eye_glow"] = loadfx("misc/fx_zombie_eye_single");
|
|
|
|
level._effect["headshot"] = loadfx("impacts/fx_flesh_hit");
|
|
level._effect["headshot_nochunks"] = loadfx("misc/fx_zombie_bloodsplat");
|
|
level._effect["bloodspurt"] = loadfx("misc/fx_zombie_bloodspurt");
|
|
|
|
if (!(isdefined(level.fx_exclude_tesla_head_light) && level.fx_exclude_tesla_head_light))
|
|
level._effect["tesla_head_light"] = loadfx("maps/zombie/fx_zombie_tesla_neck_spurt");
|
|
|
|
level._effect["zombie_guts_explosion"] = loadfx("maps/zombie/fx_zmb_tranzit_torso_explo");
|
|
level._effect["rise_burst_water"] = loadfx("maps/zombie/fx_mp_zombie_hand_dirt_burst");
|
|
level._effect["rise_billow_water"] = loadfx("maps/zombie/fx_mp_zombie_body_dirt_billowing");
|
|
level._effect["rise_dust_water"] = loadfx("maps/zombie/fx_mp_zombie_body_dust_falling");
|
|
level._effect["rise_burst"] = loadfx("maps/zombie/fx_mp_zombie_hand_dirt_burst");
|
|
level._effect["rise_billow"] = loadfx("maps/zombie/fx_mp_zombie_body_dirt_billowing");
|
|
level._effect["rise_dust"] = loadfx("maps/zombie/fx_mp_zombie_body_dust_falling");
|
|
level._effect["fall_burst"] = loadfx("maps/zombie/fx_mp_zombie_hand_dirt_burst");
|
|
level._effect["fall_billow"] = loadfx("maps/zombie/fx_mp_zombie_body_dirt_billowing");
|
|
level._effect["fall_dust"] = loadfx("maps/zombie/fx_mp_zombie_body_dust_falling");
|
|
level._effect["character_fire_death_sm"] = loadfx("env/fire/fx_fire_zombie_md");
|
|
level._effect["character_fire_death_torso"] = loadfx("env/fire/fx_fire_zombie_torso");
|
|
|
|
if (!(isdefined(level.fx_exclude_default_explosion) && level.fx_exclude_default_explosion))
|
|
level._effect["def_explosion"] = loadfx("explosions/fx_default_explosion");
|
|
|
|
if (!(isdefined(level._uses_default_wallbuy_fx) && !level._uses_default_wallbuy_fx))
|
|
{
|
|
level._effect["870mcs_zm_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_870mcs");
|
|
level._effect["vector_zm_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_ak74u");
|
|
level._effect["beretta93r_zm_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_berreta93r");
|
|
level._effect["bowie_knife_zm_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_bowie");
|
|
level._effect["claymore_zm_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_claymore");
|
|
level._effect["saritch_zm_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_m14");
|
|
level._effect["sig556_zm_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_m16");
|
|
level._effect["insas_zm_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_mp5k");
|
|
level._effect["ballista_zm_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_olympia");
|
|
}
|
|
|
|
if (!(isdefined(level._uses_sticky_grenades) && !level._uses_sticky_grenades))
|
|
{
|
|
if (!(isdefined(level.disable_fx_zmb_wall_buy_semtex) && level.disable_fx_zmb_wall_buy_semtex))
|
|
{
|
|
grenade = "sticky_grenade_zm";
|
|
|
|
if (level.script == "zm_buried")
|
|
{
|
|
grenade = "frag_grenade_zm";
|
|
}
|
|
|
|
level._effect[grenade + "_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_semtex");
|
|
}
|
|
}
|
|
|
|
if (!(isdefined(level._uses_taser_knuckles) && !level._uses_taser_knuckles))
|
|
level._effect["tazer_knuckles_zm_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_taseknuck");
|
|
|
|
if (isdefined(level.buildable_wallbuy_weapons))
|
|
level._effect["dynamic_wallbuy_fx"] = loadfx("maps/zombie/fx_zmb_wall_buy_question");
|
|
|
|
if (!(isdefined(level.disable_fx_upgrade_aquired) && level.disable_fx_upgrade_aquired))
|
|
level._effect["upgrade_aquired"] = loadfx("maps/zombie/fx_zmb_tanzit_upgrade");
|
|
}
|
|
|
|
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 pregame_think();
|
|
|
|
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");
|
|
}
|
|
|
|
pregame_think()
|
|
{
|
|
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;
|
|
|
|
setroundsplayed(0);
|
|
|
|
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 = &"ZOMBIE_WAITING_FOR_MORE_PLAYERS_CAPS";
|
|
|
|
if (num_waiting_for == 1)
|
|
{
|
|
players_str = &"ZOMBIE_WAITING_FOR_MORE_PLAYER_CAPS";
|
|
}
|
|
|
|
level.pregame_hud setText(players_str, num_waiting_for, 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(&"ZOMBIE_READY_UP_HOWTO_CAPS");
|
|
}
|
|
|
|
level.ready_up_hud.alpha = 1;
|
|
|
|
ready_up_time = 0;
|
|
ready_up_timeout = 0;
|
|
ready_up_start_time = undefined;
|
|
ready_up_start_players = undefined;
|
|
|
|
if (isDedicated() && !(is_gametype_active("zgrief") && getDvarInt("ui_gametype_team_change")))
|
|
{
|
|
ready_up_time = 60;
|
|
}
|
|
|
|
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 (ready_up_time > 0)
|
|
{
|
|
if (num_ready > 0 && !isdefined(ready_up_start_time))
|
|
{
|
|
ready_up_start_time = getTime();
|
|
ready_up_start_players = get_players();
|
|
|
|
if (!isDefined(level.ready_up_countdown_hud))
|
|
{
|
|
level.ready_up_countdown_hud = countdown_hud(&"ZOMBIE_PRE_GAME_ENDS_IN_CAPS", undefined, ready_up_time);
|
|
}
|
|
}
|
|
|
|
if (isdefined(ready_up_start_time))
|
|
{
|
|
time = getTime() - ready_up_start_time;
|
|
|
|
if (time >= ready_up_time * 1000)
|
|
{
|
|
ready_up_timeout = 1;
|
|
|
|
foreach (player in 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 pregame_think();
|
|
|
|
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 = &"ZOMBIE_WAITING_FOR_PLAYERS_READY_CAPS";
|
|
|
|
if (num_waiting_for == 1)
|
|
{
|
|
players_str = &"ZOMBIE_WAITING_FOR_PLAYER_READY_CAPS";
|
|
}
|
|
|
|
level.pregame_hud setText(players_str, num_waiting_for, 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, text_param, 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);
|
|
|
|
if (isdefined(text_param))
|
|
{
|
|
countdown_hud.countdown_text setText(text, text_param);
|
|
}
|
|
else
|
|
{
|
|
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] = "fnp45_zm";
|
|
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] = "fnp45_upgraded_zm";
|
|
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 undefined;
|
|
|
|
self scripts\zm\_zm_reimagined::additionalprimaryweapon_update_weapon_slots();
|
|
|
|
weapon_to_take = self.weapon_to_take_by_losing_specialty_additionalprimaryweapon;
|
|
|
|
if (!isDefined(weapon_to_take) || !self hasWeapon(weapon_to_take))
|
|
{
|
|
return undefined;
|
|
}
|
|
|
|
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())
|
|
{
|
|
for (i = 0; i < self.weapon_slots.size; i++)
|
|
{
|
|
if (isdefined(self.weapon_slots[i]) && self.weapon_slots[i] != weapon_to_take)
|
|
{
|
|
self switchtoweapon(self.weapon_slots[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
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 (issubstr(weapon, "one_inch_punch") && damage <= 5)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if (!isDefined(self) || !isDefined(attacker))
|
|
{
|
|
return damage;
|
|
}
|
|
|
|
if (scripts\zm\_zm_reimagined::is_tazer_weapon(weapon) || weapon == "jetgun_zm" || weapon == "riotshield_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 = scale_damage(damage, 600);
|
|
}
|
|
|
|
if (weapon == "willy_pete_zm")
|
|
{
|
|
if (!is_true(self.is_brutus))
|
|
{
|
|
if (is_true(self.real_willy_pete_damage))
|
|
{
|
|
self.real_willy_pete_damage = undefined;
|
|
}
|
|
else
|
|
{
|
|
// hack to make Smoke Grenade use MOD_UNKNOWN so zombies don't gib
|
|
self.real_willy_pete_damage = 1;
|
|
self dodamage(self.health, inflictor.origin, attacker, self, "none", "MOD_UNKNOWN", 0, weapon);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
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 = scale_damage(damage, 200);
|
|
}
|
|
}
|
|
|
|
if (weapon == "quadrotorturret_zm" && meansofdeath == "MOD_PISTOL_BULLET")
|
|
{
|
|
if (!is_true(self.is_mechz))
|
|
{
|
|
damage = scale_damage(damage, 6000);
|
|
}
|
|
}
|
|
|
|
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 (weapon == "blundergat_zm")
|
|
{
|
|
if (!is_true(self.is_brutus))
|
|
{
|
|
final_damage = scale_damage(final_damage, 500);
|
|
}
|
|
}
|
|
|
|
if (weapon == "blundergat_upgraded_zm")
|
|
{
|
|
if (!is_true(self.is_brutus))
|
|
{
|
|
final_damage = scale_damage(final_damage, 1000);
|
|
}
|
|
}
|
|
|
|
if (weapon == "blundersplat_explosive_dart_zm")
|
|
{
|
|
if (!is_true(self.is_brutus))
|
|
{
|
|
final_damage = scale_damage(final_damage, 4000);
|
|
}
|
|
}
|
|
|
|
if (weapon == "blundersplat_explosive_dart_upgraded_zm")
|
|
{
|
|
if (!is_true(self.is_brutus))
|
|
{
|
|
final_damage = scale_damage(final_damage, 8000);
|
|
}
|
|
}
|
|
|
|
if (issubstr(weapon, "metalstorm"))
|
|
{
|
|
if (issubstr(weapon, "upgraded"))
|
|
{
|
|
final_damage = scale_damage(final_damage, 10000);
|
|
}
|
|
else
|
|
{
|
|
final_damage = scale_damage(final_damage, 5000);
|
|
}
|
|
}
|
|
|
|
if (weapon == "titus6_explosive_dart_zm")
|
|
{
|
|
final_damage = scale_damage(final_damage, 3000);
|
|
}
|
|
|
|
if (weapon == "titus6_explosive_dart_upgraded_zm")
|
|
{
|
|
final_damage = scale_damage(final_damage, 6000);
|
|
}
|
|
|
|
if (weapon == "mk_titus6_zm")
|
|
{
|
|
final_damage = scale_damage(final_damage, 500);
|
|
}
|
|
|
|
if (weapon == "mk_titus6_upgraded_zm")
|
|
{
|
|
final_damage = scale_damage(final_damage, 1000);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
scale_damage(damage, damage_to_kill)
|
|
{
|
|
scalar = damage / damage_to_kill;
|
|
scaled_damage = int(scalar * level.zombie_health) + 1;
|
|
|
|
if (damage < scaled_damage)
|
|
{
|
|
return scaled_damage;
|
|
}
|
|
|
|
return 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"))
|
|
{
|
|
if (is_true(self.divetoprone))
|
|
{
|
|
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 (sweapon == "willy_pete_zm")
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
exp_damage = 75;
|
|
|
|
if (sweapon == "titus6_explosive_dart_zm" || sweapon == "titus6_explosive_dart_upgraded_zm")
|
|
{
|
|
exp_damage = 15;
|
|
}
|
|
|
|
if (self.health > exp_damage && !is_true(self.is_zombie))
|
|
{
|
|
return exp_damage;
|
|
}
|
|
}
|
|
|
|
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();
|
|
|
|
if (level.script != "zm_nuked")
|
|
{
|
|
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);
|
|
}
|
|
|
|
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);
|
|
} |