1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-10 07:08:06 -05:00
Files
BO2-Reimagined/scripts/zm/_zm_reimagined.gsc
2021-12-05 18:45:02 -08:00

5873 lines
133 KiB
Plaintext

#include maps/mp/gametypes_zm/_hud_util;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
main()
{
replaceFunc(maps/mp/zombies/_zm_playerhealth::playerhealthregen, ::playerhealthregen);
}
init()
{
level.inital_spawn = true;
thread onplayerconnect();
}
onplayerconnect()
{
while(true)
{
level waittill("connecting", player);
player thread onplayerspawned();
}
}
onplayerspawned()
{
level endon( "game_ended" );
self endon( "disconnect" );
self.initial_spawn = true;
for(;;)
{
self waittill( "spawned_player" );
if(level.inital_spawn)
{
level.inital_spawn = false;
level thread post_all_players_spawned();
}
if (self.initial_spawn)
{
self.initial_spawn = false;
self screecher_remove_hint();
self bank_clear_account_value();
self weapon_locker_clear_stored_weapondata();
self tomb_give_shovel();
self thread enemy_counter_hud();
self thread timer_hud();
self thread health_bar_hud();
self thread zone_hud();
self thread fall_velocity_check();
self thread remove_fast_melee();
self thread solo_lives_fix();
self thread on_equipment_placed();
self thread give_additional_perks();
self thread buildable_piece_remove_on_last_stand();
self thread disable_player_pers_upgrades();
//self thread disable_sniper_scope_sway(); // Buried does not load the clientfield
self thread jetgun_fast_cooldown();
self thread jetgun_fast_spinlerp();
self thread jetgun_overheated_fix();
self thread additionalprimaryweapon_save_weapons();
self thread additionalprimaryweapon_restore_weapons();
self thread additionalprimaryweapon_indicator();
self thread tombstone_save_perks();
self thread tombstone_restore_perks();
self thread whos_who_spawn_changes();
self thread electric_cherry_unlimited();
self thread vulture_disable_stink_while_standing();
//self thread test();
//self.score = 1000000;
//maps/mp/zombies/_zm_perks::give_perk( "specialty_armorvest", 0 );
//self GiveWeapon("dsr50_zm");
//self GiveMaxAmmo("dsr50_zm");
}
self set_movement_dvars();
self name_fade_changes();
self increase_melee_range();
self disable_melee_lunge();
self enable_friendly_fire();
self set_player_lethal_grenade_semtex();
self setperk( "specialty_unlimitedsprint" );
self setperk( "specialty_fastmantle" );
}
}
post_all_players_spawned()
{
disable_solo_revive();
flag_wait( "start_zombie_round_logic" );
wait 0.05;
maps/mp/zombies/_zm::register_player_damage_callback( ::player_damage_override );
disable_high_round_walkers();
disable_perk_pause();
enable_free_perks_before_power();
disable_carpenter();
disable_bank();
wallbuy_increase_trigger_radius();
wallbuy_location_changes();
zone_changes();
enemies_ignore_equipments();
screecher_spawner_changes();
screecher_remove_near_miss();
electric_trap_always_kill();
jetgun_disable_explode_overheat();
jetgun_remove_forced_weapon_switch();
jetgun_remove_drop_fn();
depot_remove_lava_collision();
depot_grief_close_local_electric_doors();
town_move_staminup_machine();
tombstone_disable_suicide();
tombstone_spawn_changes();
slipgun_always_kill();
slipgun_disable_reslip();
prison_tower_trap_changes();
buried_turn_power_on();
buried_deleteslothbarricades();
borough_move_quickrevive_machine();
borough_move_speedcola_machine();
borough_move_staminup_machine();
tomb_remove_weighted_random_perks();
tomb_challenges_changes();
tomb_soul_box_changes();
level thread wallbuy_cost_changes();
level thread buildbuildables();
level thread buildcraftables();
level thread disable_pers_upgrades();
level thread zombie_health_fix();
level thread solo_revive_trigger_fix();
level thread transit_add_tombstone_machine_solo();
level thread transit_power_local_electric_doors_globally();
level thread transit_b23r_hint_string_fix();
level thread town_move_tombstone_machine();
level thread depot_grief_link_nodes();
level thread highrise_solo_revive_fix();
level thread prison_auto_refuel_plane();
level thread buried_enable_fountain_transport();
level thread buried_disable_ghost_free_perk_on_damage();
level thread wallbuy_dynamic_increase_trigger_radius();
level thread tomb_increase_solo_door_prices();
level thread tomb_remove_shovels_from_map();
level thread tomb_zombie_blood_dig_changes();
//level.round_number = 115;
//level.zombie_move_speed = 105;
//level.zombie_vars[ "zombie_spawn_delay" ] = 0.08;
//level.local_doors_stay_open = 1;
//level.power_local_doors_globally = 1;
}
set_movement_dvars()
{
self setClientDvar( "player_backSpeedScale", 1 );
self setClientDvar( "player_strafeSpeedScale", 1 );
self setClientDvar( "player_sprintStrafeSpeedScale", 1 );
self setClientDvar( "dtp_post_move_pause", 0 );
self setClientDvar( "dtp_exhaustion_window", 100 );
self setClientDvar( "dtp_startup_delay", 100 );
}
name_fade_changes()
{
self setClientDvar( "cg_friendlyNameFadeIn", 0 );
self setClientDvar( "cg_friendlyNameFadeOut", 250 );
self setClientDvar( "cg_enemyNameFadeIn", 0 );
self setClientDvar( "cg_enemyNameFadeOut", 250 );
}
increase_melee_range()
{
self setClientDvar( "player_meleeRange", 64 );
}
disable_melee_lunge()
{
self setClientDvar( "aim_automelee_enabled", 0 );
}
enable_friendly_fire()
{
self setClientDvar( "g_friendlyfireDist", 0 );
}
health_bar_hud()
{
self endon("disconnect");
flag_wait( "initial_blackscreen_passed" );
x = -364;
y = -70;
if (level.script == "zm_buried")
{
y -= 25;
}
else if (level.script == "zm_tomb")
{
y -= 60;
}
health_bar = self createbar((1, 1, 1), 110, 14);
health_bar setpoint(undefined, "BOTTOM", x, y);
health_bar.hidewheninmenu = 1;
health_bar.bar.hidewheninmenu = 1;
health_bar.barframe.hidewheninmenu = 1;
health_bar_text = createfontstring("objective", 1.4);
health_bar_text setpoint(undefined, "BOTTOM", x, y);
health_bar_text.color = (0.21, 0, 0);
health_bar_text.hidewheninmenu = 1;
while (1)
{
if (isDefined(self.e_afterlife_corpse))
{
if (health_bar.alpha != 0)
{
health_bar.alpha = 0;
health_bar.bar.alpha = 0;
health_bar.barframe.alpha = 0;
health_bar_text.alpha = 0;
}
wait 0.05;
continue;
}
if (health_bar.alpha != 1)
{
health_bar.alpha = 1;
health_bar.bar.alpha = 1;
health_bar.barframe.alpha = 1;
health_bar_text.alpha = 1;
}
health_bar updatebar(self.health / self.maxhealth);
health_bar_text setvalue(self.health);
wait 0.05;
}
}
enemy_counter_hud()
{
self endon("disconnect");
if ( getDvar( "g_gametype" ) == "zgrief" )
{
return;
}
enemy_counter_hud = newClientHudElem(self);
enemy_counter_hud.alignx = "left";
enemy_counter_hud.aligny = "top";
enemy_counter_hud.horzalign = "user_left";
enemy_counter_hud.vertalign = "user_top";
enemy_counter_hud.x += 5;
if (level.script == "zm_tomb")
{
enemy_counter_hud.y += 49;
}
else
{
enemy_counter_hud.y += 2;
}
enemy_counter_hud.fontscale = 1.4;
enemy_counter_hud.alpha = 0;
enemy_counter_hud.color = ( 1, 1, 1 );
enemy_counter_hud.hidewheninmenu = 1;
enemy_counter_hud.label = &"Enemies Remaining: ";
flag_wait( "initial_blackscreen_passed" );
enemy_counter_hud.alpha = 1;
while (1)
{
enemies = get_round_enemy_array().size + level.zombie_total;
if (enemies == 0)
{
enemy_counter_hud setText("");
}
else
{
enemy_counter_hud setValue(enemies);
}
wait 0.05;
}
}
timer_hud()
{
self endon("disconnect");
self thread round_timer_hud();
timer_hud = newClientHudElem(self);
timer_hud.alignx = "right";
timer_hud.aligny = "top";
timer_hud.horzalign = "user_right";
timer_hud.vertalign = "user_top";
timer_hud.x -= 5;
timer_hud.y += 2;
timer_hud.fontscale = 1.4;
timer_hud.alpha = 0;
timer_hud.color = ( 1, 1, 1 );
timer_hud.hidewheninmenu = 1;
timer_hud.label = &"Time: ";
flag_wait( "initial_blackscreen_passed" );
timer_hud.alpha = 1;
timer_hud setTimerUp(0);
}
round_timer_hud()
{
self endon("disconnect");
round_timer_hud = newClientHudElem(self);
round_timer_hud.alignx = "right";
round_timer_hud.aligny = "top";
round_timer_hud.horzalign = "user_right";
round_timer_hud.vertalign = "user_top";
round_timer_hud.x -= 5;
round_timer_hud.y += 17;
round_timer_hud.fontscale = 1.4;
round_timer_hud.alpha = 0;
round_timer_hud.color = ( 1, 1, 1 );
round_timer_hud.hidewheninmenu = 1;
round_timer_hud.label = &"Round Time: ";
flag_wait( "initial_blackscreen_passed" );
round_timer_hud.alpha = 1;
while (1)
{
round_timer_hud setTimerUp(0);
start_time = int(getTime() / 1000);
if ( getDvar( "g_gametype" ) == "zgrief" )
{
level waittill( "restart_round" );
continue;
}
level waittill( "end_of_round" );
end_time = int(getTime() / 1000);
time = end_time - start_time;
set_time_frozen(round_timer_hud, time);
}
}
set_time_frozen(hud, time)
{
level endon( "start_of_round" );
time -= .1; // need to set it below the number or it shows the next number
while (1)
{
hud setTimer(time);
wait 0.5;
}
}
zone_hud()
{
self endon("disconnect");
x = 5;
y = -115;
if (level.script == "zm_buried")
{
y -= 25;
}
else if (level.script == "zm_tomb")
{
y -= 60;
}
zone_hud = newClientHudElem(self);
zone_hud.alignx = "left";
zone_hud.aligny = "bottom";
zone_hud.horzalign = "user_left";
zone_hud.vertalign = "user_bottom";
zone_hud.x += x;
zone_hud.y += y;
zone_hud.fontscale = 1.4;
zone_hud.alpha = 0;
zone_hud.color = ( 1, 1, 1 );
zone_hud.hidewheninmenu = 1;
flag_wait( "initial_blackscreen_passed" );
prev_zone = "";
while (1)
{
zone = self get_zone_name();
if(prev_zone != zone)
{
prev_zone = zone;
zone_hud fadeovertime(0.25);
zone_hud.alpha = 0;
wait 0.25;
zone_hud settext(zone);
zone_hud fadeovertime(0.25);
zone_hud.alpha = 1;
wait 0.25;
continue;
}
wait 0.05;
}
}
get_zone_name()
{
zone = self get_current_zone();
if (!isDefined(zone))
{
return "";
}
name = zone;
if (level.script == "zm_transit")
{
if (zone == "zone_pri")
{
name = "Bus Depot";
}
else if (zone == "zone_pri2")
{
name = "Bus Depot Hallway";
}
else if (zone == "zone_station_ext")
{
name = "Outside Bus Depot";
}
else if (zone == "zone_trans_2b")
{
name = "Fog After Bus Depot";
}
else if (zone == "zone_trans_2")
{
name = "Tunnel Entrance";
}
else if (zone == "zone_amb_tunnel")
{
name = "Tunnel";
}
else if (zone == "zone_trans_3")
{
name = "Tunnel Exit";
}
else if (zone == "zone_roadside_west")
{
name = "Outside Diner";
}
else if (zone == "zone_gas")
{
name = "Gas Station";
}
else if (zone == "zone_roadside_east")
{
name = "Outside Garage";
}
else if (zone == "zone_trans_diner")
{
name = "Fog Outside Diner";
}
else if (zone == "zone_trans_diner2")
{
name = "Fog Outside Garage";
}
else if (zone == "zone_gar")
{
name = "Garage";
}
else if (zone == "zone_din")
{
name = "Diner";
}
else if (zone == "zone_diner_roof")
{
name = "Diner Roof";
}
else if (zone == "zone_trans_4")
{
name = "Fog After Diner";
}
else if (zone == "zone_amb_forest")
{
name = "Forest";
}
else if (zone == "zone_trans_10")
{
name = "Outside Church";
}
else if (zone == "zone_town_church")
{
name = "Upper South Town";
}
else if (zone == "zone_trans_5")
{
name = "Fog Before Farm";
}
else if (zone == "zone_far")
{
name = "Outside Farm";
}
else if (zone == "zone_far_ext")
{
name = "Farm";
}
else if (zone == "zone_brn")
{
name = "Barn";
}
else if (zone == "zone_farm_house")
{
name = "Farmhouse";
}
else if (zone == "zone_trans_6")
{
name = "Fog After Farm";
}
else if (zone == "zone_amb_cornfield")
{
name = "Cornfield";
}
else if (zone == "zone_cornfield_prototype")
{
name = "Nacht";
}
else if (zone == "zone_trans_7")
{
name = "Upper Fog Before Power";
}
else if (zone == "zone_trans_pow_ext1")
{
name = "Fog Before Power";
}
else if (zone == "zone_pow")
{
name = "Outside Power Station";
}
else if (zone == "zone_prr")
{
name = "Power Station";
}
else if (zone == "zone_pcr")
{
name = "Power Control Room";
}
else if (zone == "zone_pow_warehouse")
{
name = "Warehouse";
}
else if (zone == "zone_trans_8")
{
name = "Fog After Power";
}
else if (zone == "zone_amb_power2town")
{
name = "Cabin";
}
else if (zone == "zone_trans_9")
{
name = "Fog Before Town";
}
else if (zone == "zone_town_north")
{
name = "North Town";
}
else if (zone == "zone_tow")
{
name = "Center Town";
}
else if (zone == "zone_town_east")
{
name = "East Town";
}
else if (zone == "zone_town_west")
{
name = "West Town";
}
else if (zone == "zone_town_south")
{
name = "South Town";
}
else if (zone == "zone_bar")
{
name = "Bar";
}
else if (zone == "zone_town_barber")
{
name = "Bookstore";
}
else if (zone == "zone_ban")
{
name = "Bank";
}
else if (zone == "zone_ban_vault")
{
name = "Bank Vault";
}
else if (zone == "zone_tbu")
{
name = "Below Bank";
}
else if (zone == "zone_trans_11")
{
name = "Fog After Town";
}
else if (zone == "zone_amb_bridge")
{
name = "Bridge";
}
else if (zone == "zone_trans_1")
{
name = "Fog Before Bus Depot";
}
}
else if (level.script == "zm_nuked")
{
if (zone == "culdesac_yellow_zone")
{
name = "Yellow House Cul-de-sac";
}
else if (zone == "culdesac_green_zone")
{
name = "Green House Cul-de-sac";
}
else if (zone == "truck_zone")
{
name = "Truck";
}
else if (zone == "openhouse1_f1_zone")
{
name = "Green House Downstairs";
}
else if (zone == "openhouse1_f2_zone")
{
name = "Green House Upstairs";
}
else if (zone == "openhouse1_backyard_zone")
{
name = "Green House Backyard";
}
else if (zone == "openhouse2_f1_zone")
{
name = "Yellow House Downstairs";
}
else if (zone == "openhouse2_f2_zone")
{
name = "Yellow House Upstairs";
}
else if (zone == "openhouse2_backyard_zone")
{
name = "Yellow House Backyard";
}
else if (zone == "ammo_door_zone")
{
name = "Yellow House Backyard Door";
}
}
else if (level.script == "zm_highrise")
{
if (zone == "zone_green_start")
{
name = "Green Highrise Level 3b";
}
else if (zone == "zone_green_escape_pod")
{
name = "Escape Pod";
}
else if (zone == "zone_green_escape_pod_ground")
{
name = "Escape Pod Shaft";
}
else if (zone == "zone_green_level1")
{
name = "Green Highrise Level 3a";
}
else if (zone == "zone_green_level2a")
{
name = "Green Highrise Level 2a";
}
else if (zone == "zone_green_level2b")
{
name = "Green Highrise Level 2b";
}
else if (zone == "zone_green_level3a")
{
name = "Green Highrise Restaurant";
}
else if (zone == "zone_green_level3b")
{
name = "Green Highrise Level 1a";
}
else if (zone == "zone_green_level3c")
{
name = "Green Highrise Level 1b";
}
else if (zone == "zone_green_level3d")
{
name = "Green Highrise Behind Restaurant";
}
else if (zone == "zone_orange_level1")
{
name = "Upper Orange Highrise Level 2";
}
else if (zone == "zone_orange_level2")
{
name = "Upper Orange Highrise Level 1";
}
else if (zone == "zone_orange_elevator_shaft_top")
{
name = "Elevator Shaft Level 3";
}
else if (zone == "zone_orange_elevator_shaft_middle_1")
{
name = "Elevator Shaft Level 2";
}
else if (zone == "zone_orange_elevator_shaft_middle_2")
{
name = "Elevator Shaft Level 1";
}
else if (zone == "zone_orange_elevator_shaft_bottom")
{
name = "Elevator Shaft Bottom";
}
else if (zone == "zone_orange_level3a")
{
name = "Lower Orange Highrise Level 1a";
}
else if (zone == "zone_orange_level3b")
{
name = "Lower Orange Highrise Level 1b";
}
else if (zone == "zone_blue_level5")
{
name = "Lower Blue Highrise Level 1";
}
else if (zone == "zone_blue_level4a")
{
name = "Lower Blue Highrise Level 2a";
}
else if (zone == "zone_blue_level4b")
{
name = "Lower Blue Highrise Level 2b";
}
else if (zone == "zone_blue_level4c")
{
name = "Lower Blue Highrise Level 2c";
}
else if (zone == "zone_blue_level2a")
{
name = "Upper Blue Highrise Level 1a";
}
else if (zone == "zone_blue_level2b")
{
name = "Upper Blue Highrise Level 1b";
}
else if (zone == "zone_blue_level2c")
{
name = "Upper Blue Highrise Level 1c";
}
else if (zone == "zone_blue_level2d")
{
name = "Upper Blue Highrise Level 1d";
}
else if (zone == "zone_blue_level1a")
{
name = "Upper Blue Highrise Level 2a";
}
else if (zone == "zone_blue_level1b")
{
name = "Upper Blue Highrise Level 2b";
}
else if (zone == "zone_blue_level1c")
{
name = "Upper Blue Highrise Level 2c";
}
}
else if (level.script == "zm_prison")
{
if (zone == "zone_start")
{
name = "D-Block";
}
else if (zone == "zone_library")
{
name = "Library";
}
else if (zone == "zone_cellblock_west")
{
name = "Cellblock 2nd Floor";
}
else if (zone == "zone_cellblock_west_gondola")
{
name = "Cellblock 3rd Floor";
}
else if (zone == "zone_cellblock_west_gondola_dock")
{
name = "Cellblock Gondola";
}
else if (zone == "zone_cellblock_west_barber")
{
name = "Michigan Avenue";
}
else if (zone == "zone_cellblock_east")
{
name = "Times Square";
}
else if (zone == "zone_cafeteria")
{
name = "Cafeteria";
}
else if (zone == "zone_cafeteria_end")
{
name = "Cafeteria End";
}
else if (zone == "zone_infirmary")
{
name = "Infirmary 1";
}
else if (zone == "zone_infirmary_roof")
{
name = "Infirmary 2";
}
else if (zone == "zone_roof_infirmary")
{
name = "Roof 1";
}
else if (zone == "zone_roof")
{
name = "Roof 2";
}
else if (zone == "zone_cellblock_west_warden")
{
name = "Sally Port";
}
else if (zone == "zone_warden_office")
{
name = "Warden's Office";
}
else if (zone == "cellblock_shower")
{
name = "Showers";
}
else if (zone == "zone_citadel_shower")
{
name = "Citadel To Showers";
}
else if (zone == "zone_citadel")
{
name = "Citadel";
}
else if (zone == "zone_citadel_warden")
{
name = "Citadel To Warden's Office";
}
else if (zone == "zone_citadel_stairs")
{
name = "Citadel Tunnels";
}
else if (zone == "zone_citadel_basement")
{
name = "Citadel Basement";
}
else if (zone == "zone_citadel_basement_building")
{
name = "China Alley";
}
else if (zone == "zone_studio")
{
name = "Building 64";
}
else if (zone == "zone_dock")
{
name = "Docks";
}
else if (zone == "zone_dock_puzzle")
{
name = "Docks Gates";
}
else if (zone == "zone_dock_gondola")
{
name = "Upper Docks";
}
else if (zone == "zone_golden_gate_bridge")
{
name = "Golden Gate Bridge";
}
else if (zone == "zone_gondola_ride")
{
name = "Gondola";
}
}
else if (level.script == "zm_buried")
{
if (zone == "zone_start")
{
name = "Processing";
}
else if (zone == "zone_start_lower")
{
name = "Lower Processing";
}
else if (zone == "zone_tunnels_center")
{
name = "Center Tunnels";
}
else if (zone == "zone_tunnels_north")
{
name = "Courthouse Tunnels 2";
}
else if (zone == "zone_tunnels_north2")
{
name = "Courthouse Tunnels 1";
}
else if (zone == "zone_tunnels_south")
{
name = "Saloon Tunnels 3";
}
else if (zone == "zone_tunnels_south2")
{
name = "Saloon Tunnels 2";
}
else if (zone == "zone_tunnels_south3")
{
name = "Saloon Tunnels 1";
}
else if (zone == "zone_street_lightwest")
{
name = "Outside General Store & Bank";
}
else if (zone == "zone_street_lightwest_alley")
{
name = "Outside General Store & Bank Alley";
}
else if (zone == "zone_morgue_upstairs")
{
name = "Morgue";
}
else if (zone == "zone_underground_jail")
{
name = "Jail Downstairs";
}
else if (zone == "zone_underground_jail2")
{
name = "Jail Upstairs";
}
else if (zone == "zone_general_store")
{
name = "General Store";
}
else if (zone == "zone_stables")
{
name = "Stables";
}
else if (zone == "zone_street_darkwest")
{
name = "Outside Gunsmith";
}
else if (zone == "zone_street_darkwest_nook")
{
name = "Outside Gunsmith Nook";
}
else if (zone == "zone_gun_store")
{
name = "Gunsmith";
}
else if (zone == "zone_bank")
{
name = "Bank";
}
else if (zone == "zone_tunnel_gun2stables")
{
name = "Stables To Gunsmith Tunnel 2";
}
else if (zone == "zone_tunnel_gun2stables2")
{
name = "Stables To Gunsmith Tunnel";
}
else if (zone == "zone_street_darkeast")
{
name = "Outside Saloon & Toy Store";
}
else if (zone == "zone_street_darkeast_nook")
{
name = "Outside Saloon & Toy Store Nook";
}
else if (zone == "zone_underground_bar")
{
name = "Saloon";
}
else if (zone == "zone_tunnel_gun2saloon")
{
name = "Saloon To Gunsmith Tunnel";
}
else if (zone == "zone_toy_store")
{
name = "Toy Store Downstairs";
}
else if (zone == "zone_toy_store_floor2")
{
name = "Toy Store Upstairs";
}
else if (zone == "zone_toy_store_tunnel")
{
name = "Toy Store Tunnel";
}
else if (zone == "zone_candy_store")
{
name = "Candy Store Downstairs";
}
else if (zone == "zone_candy_store_floor2")
{
name = "Candy Store Upstairs";
}
else if (zone == "zone_street_lighteast")
{
name = "Outside Courthouse & Candy Store";
}
else if (zone == "zone_underground_courthouse")
{
name = "Courthouse Downstairs";
}
else if (zone == "zone_underground_courthouse2")
{
name = "Courthouse Upstairs";
}
else if (zone == "zone_street_fountain")
{
name = "Fountain";
}
else if (zone == "zone_church_graveyard")
{
name = "Graveyard";
}
else if (zone == "zone_church_main")
{
name = "Church Downstairs";
}
else if (zone == "zone_church_upstairs")
{
name = "Church Upstairs";
}
else if (zone == "zone_mansion_lawn")
{
name = "Mansion Lawn";
}
else if (zone == "zone_mansion")
{
name = "Mansion";
}
else if (zone == "zone_mansion_backyard")
{
name = "Mansion Backyard";
}
else if (zone == "zone_maze")
{
name = "Maze";
}
else if (zone == "zone_maze_staircase")
{
name = "Maze Staircase";
}
}
else if (level.script == "zm_tomb")
{
if (isDefined(self.teleporting) && self.teleporting)
{
return "";
}
if (zone == "zone_start")
{
name = "Lower Laboratory";
}
else if (zone == "zone_start_a")
{
name = "Upper Laboratory";
}
else if (zone == "zone_start_b")
{
name = "Generator 1";
}
else if (zone == "zone_bunker_1a")
{
name = "Generator 3 Bunker 1";
}
else if (zone == "zone_fire_stairs")
{
name = "Fire Tunnel";
}
else if (zone == "zone_bunker_1")
{
name = "Generator 3 Bunker 2";
}
else if (zone == "zone_bunker_3a")
{
name = "Generator 3";
}
else if (zone == "zone_bunker_3b")
{
name = "Generator 3 Bunker 3";
}
else if (zone == "zone_bunker_2a")
{
name = "Generator 2 Bunker 1";
}
else if (zone == "zone_bunker_2")
{
name = "Generator 2 Bunker 2";
}
else if (zone == "zone_bunker_4a")
{
name = "Generator 2";
}
else if (zone == "zone_bunker_4b")
{
name = "Generator 2 Bunker 3";
}
else if (zone == "zone_bunker_4c")
{
name = "Tank Station";
}
else if (zone == "zone_bunker_4d")
{
name = "Above Tank Station";
}
else if (zone == "zone_bunker_tank_c")
{
name = "Generator 2 Tank Route 1";
}
else if (zone == "zone_bunker_tank_c1")
{
name = "Generator 2 Tank Route 2";
}
else if (zone == "zone_bunker_4e")
{
name = "Generator 2 Tank Route 3";
}
else if (zone == "zone_bunker_tank_d")
{
name = "Generator 2 Tank Route 4";
}
else if (zone == "zone_bunker_tank_d1")
{
name = "Generator 2 Tank Route 5";
}
else if (zone == "zone_bunker_4f")
{
name = "zone_bunker_4f";
}
else if (zone == "zone_bunker_5a")
{
name = "Workshop Downstairs";
}
else if (zone == "zone_bunker_5b")
{
name = "Workshop Upstairs";
}
else if (zone == "zone_nml_2a")
{
name = "No Man's Land Walkway";
}
else if (zone == "zone_nml_2")
{
name = "No Man's Land Entrance";
}
else if (zone == "zone_bunker_tank_e")
{
name = "Generator 5 Tank Route 1";
}
else if (zone == "zone_bunker_tank_e1")
{
name = "Generator 5 Tank Route 2";
}
else if (zone == "zone_bunker_tank_e2")
{
name = "zone_bunker_tank_e2";
}
else if (zone == "zone_bunker_tank_f")
{
name = "Generator 5 Tank Route 3";
}
else if (zone == "zone_nml_1")
{
name = "Generator 5 Tank Route 4";
}
else if (zone == "zone_nml_4")
{
name = "Generator 5 Tank Route 5";
}
else if (zone == "zone_nml_0")
{
name = "Generator 5 Left Footstep";
}
else if (zone == "zone_nml_5")
{
name = "Generator 5 Right Footstep Walkway";
}
else if (zone == "zone_nml_farm")
{
name = "Generator 5";
}
else if (zone == "zone_nml_celllar")
{
name = "Generator 5 Cellar";
}
else if (zone == "zone_bolt_stairs")
{
name = "Lightning Tunnel";
}
else if (zone == "zone_nml_3")
{
name = "No Man's Land 1st Right Footstep";
}
else if (zone == "zone_nml_2b")
{
name = "No Man's Land Stairs";
}
else if (zone == "zone_nml_6")
{
name = "No Man's Land Left Footstep";
}
else if (zone == "zone_nml_8")
{
name = "No Man's Land 2nd Right Footstep";
}
else if (zone == "zone_nml_10a")
{
name = "Generator 4 Tank Route 1";
}
else if (zone == "zone_nml_10")
{
name = "Generator 4 Tank Route 2";
}
else if (zone == "zone_nml_7")
{
name = "Generator 4 Tank Route 3";
}
else if (zone == "zone_bunker_tank_a")
{
name = "Generator 4 Tank Route 4";
}
else if (zone == "zone_bunker_tank_a1")
{
name = "Generator 4 Tank Route 5";
}
else if (zone == "zone_bunker_tank_a2")
{
name = "zone_bunker_tank_a2";
}
else if (zone == "zone_bunker_tank_b")
{
name = "Generator 4 Tank Route 6";
}
else if (zone == "zone_nml_9")
{
name = "Generator 4 Left Footstep";
}
else if (zone == "zone_air_stairs")
{
name = "Wind Tunnel";
}
else if (zone == "zone_nml_11")
{
name = "Generator 4";
}
else if (zone == "zone_nml_12")
{
name = "Generator 4 Right Footstep";
}
else if (zone == "zone_nml_16")
{
name = "Excavation Site Front Path";
}
else if (zone == "zone_nml_17")
{
name = "Excavation Site Back Path";
}
else if (zone == "zone_nml_18")
{
name = "Excavation Site Level 3";
}
else if (zone == "zone_nml_19")
{
name = "Excavation Site Level 2";
}
else if (zone == "ug_bottom_zone")
{
name = "Excavation Site Level 1";
}
else if (zone == "zone_nml_13")
{
name = "Generator 5 To Generator 6 Path";
}
else if (zone == "zone_nml_14")
{
name = "Generator 4 To Generator 6 Path";
}
else if (zone == "zone_nml_15")
{
name = "Generator 6 Entrance";
}
else if (zone == "zone_village_0")
{
name = "Generator 6 Left Footstep";
}
else if (zone == "zone_village_5")
{
name = "Generator 6 Tank Route 1";
}
else if (zone == "zone_village_5a")
{
name = "Generator 6 Tank Route 2";
}
else if (zone == "zone_village_5b")
{
name = "Generator 6 Tank Route 3";
}
else if (zone == "zone_village_1")
{
name = "Generator 6 Tank Route 4";
}
else if (zone == "zone_village_4b")
{
name = "Generator 6 Tank Route 5";
}
else if (zone == "zone_village_4a")
{
name = "Generator 6 Tank Route 6";
}
else if (zone == "zone_village_4")
{
name = "Generator 6 Tank Route 7";
}
else if (zone == "zone_village_2")
{
name = "Church";
}
else if (zone == "zone_village_3")
{
name = "Generator 6 Right Footstep";
}
else if (zone == "zone_village_3a")
{
name = "Generator 6";
}
else if (zone == "zone_ice_stairs")
{
name = "Ice Tunnel";
}
else if (zone == "zone_bunker_6")
{
name = "Above Generator 3 Bunker";
}
else if (zone == "zone_nml_20")
{
name = "Above No Man's Land";
}
else if (zone == "zone_village_6")
{
name = "Behind Church";
}
else if (zone == "zone_chamber_0")
{
name = "The Crazy Place Lightning Chamber";
}
else if (zone == "zone_chamber_1")
{
name = "The Crazy Place Lightning & Ice";
}
else if (zone == "zone_chamber_2")
{
name = "The Crazy Place Ice Chamber";
}
else if (zone == "zone_chamber_3")
{
name = "The Crazy Place Fire & Lightning";
}
else if (zone == "zone_chamber_4")
{
name = "The Crazy Place Center";
}
else if (zone == "zone_chamber_5")
{
name = "The Crazy Place Ice & Wind";
}
else if (zone == "zone_chamber_6")
{
name = "The Crazy Place Fire Chamber";
}
else if (zone == "zone_chamber_7")
{
name = "The Crazy Place Wind & Fire";
}
else if (zone == "zone_chamber_8")
{
name = "The Crazy Place Wind Chamber";
}
else if (zone == "zone_robot_head")
{
name = "Robot's Head";
}
}
return name;
}
playerhealthregen()
{
self notify( "playerHealthRegen" );
self endon( "playerHealthRegen" );
self endon( "death" );
self endon( "disconnect" );
if ( !isDefined( self.flag ) )
{
self.flag = [];
self.flags_lock = [];
}
if ( !isDefined( self.flag[ "player_has_red_flashing_overlay" ] ) )
{
self player_flag_init( "player_has_red_flashing_overlay" );
self player_flag_init( "player_is_invulnerable" );
}
self player_flag_clear( "player_has_red_flashing_overlay" );
self player_flag_clear( "player_is_invulnerable" );
self thread maps/mp/zombies/_zm_playerhealth::healthoverlay();
level.playerhealth_regularregendelay = 2000;
level.longregentime = 4000;
oldratio = 1;
veryhurt = 0;
playerjustgotredflashing = 0;
invultime = 0;
hurttime = 0;
newhealth = 0;
lastinvulratio = 1;
healthoverlaycutoff = 0.2;
self thread maps/mp/zombies/_zm_playerhealth::playerhurtcheck();
if ( !isDefined( self.veryhurt ) )
{
self.veryhurt = 0;
}
self.bolthit = 0;
if ( getDvar( "scr_playerInvulTimeScale" ) == "" )
{
setdvar( "scr_playerInvulTimeScale", 1 );
}
playerinvultimescale = getDvarFloat( "scr_playerInvulTimeScale" );
for ( ;; )
{
wait 0.05;
waittillframeend;
health_ratio = self.health / self.maxhealth;
maxhealthratio = self.maxhealth / 100;
regenrate = 0.05 / maxhealthratio;
regularregendelay = 2000;
longregendelay = 4000;
has_revive = 0;
if (flag("solo_game"))
{
if (isDefined(self.bought_solo_revive) && self.bought_solo_revive)
{
has_revive = 1;
}
}
else
{
if (self hasPerk("specialty_quickrevive"))
{
has_revive = 1;
}
}
if (has_revive)
{
regenrate *= 1.25;
regularregendelay *= 0.75;
longregendelay *= 0.75;
}
if ( health_ratio > healthoverlaycutoff )
{
if ( self player_flag( "player_has_red_flashing_overlay" ) )
{
player_flag_clear( "player_has_red_flashing_overlay" );
}
lastinvulratio = 1;
playerjustgotredflashing = 0;
veryhurt = 0;
if ( self.health == self.maxhealth )
{
continue;
}
}
else if ( self.health <= 0 )
{
return;
}
wasveryhurt = veryhurt;
if ( health_ratio <= healthoverlaycutoff )
{
veryhurt = 1;
if ( !wasveryhurt )
{
hurttime = getTime();
self player_flag_set( "player_has_red_flashing_overlay" );
playerjustgotredflashing = 1;
}
}
if ( self.hurtagain )
{
hurttime = getTime();
self.hurtagain = 0;
}
if ( health_ratio >= oldratio )
{
if ( ( getTime() - hurttime ) < regularregendelay )
{
continue;
}
else
{
self.veryhurt = veryhurt;
newhealth = health_ratio;
if ( veryhurt )
{
if ( ( getTime() - hurttime ) >= longregendelay )
{
newhealth += regenrate;
}
}
else
{
newhealth += regenrate;
}
}
if ( newhealth > 1 )
{
newhealth = 1;
}
if ( newhealth <= 0 )
{
return;
}
self setnormalhealth( newhealth );
oldratio = self.health / self.maxhealth;
continue;
}
else
{
invulworthyhealthdrop = ( lastinvulratio - health_ratio ) > level.worthydamageratio;
}
if ( self.health <= 1 )
{
self setnormalhealth( 1 / self.maxhealth );
invulworthyhealthdrop = 1;
}
oldratio = self.health / self.maxhealth;
self notify( "hit_again" );
hurttime = getTime();
if ( !invulworthyhealthdrop || playerinvultimescale <= 0 )
{
continue;
}
else
{
if ( self player_flag( "player_is_invulnerable" ) )
{
continue;
}
else
{
self player_flag_set( "player_is_invulnerable" );
level notify( "player_becoming_invulnerable" );
if ( playerjustgotredflashing )
{
invultime = level.invultime_onshield;
playerjustgotredflashing = 0;
}
else if ( veryhurt )
{
invultime = level.invultime_postshield;
}
else
{
invultime = level.invultime_preshield;
}
invultime *= playerinvultimescale;
lastinvulratio = self.health / self.maxhealth;
self thread maps/mp/zombies/_zm_playerhealth::playerinvul( invultime );
}
}
}
}
set_player_lethal_grenade_semtex()
{
if (level.script != "zm_transit" && level.script != "zm_nuked" && level.script != "zm_highrise" && level.script != "zm_tomb")
{
return;
}
self takeweapon( self get_player_lethal_grenade() );
self set_player_lethal_grenade( "sticky_grenade_zm" );
self giveweapon( self get_player_lethal_grenade() );
self setweaponammoclip( self get_player_lethal_grenade(), 0 );
}
fall_velocity_check()
{
self endon("disconnect");
while (1)
{
was_on_ground = 1;
self.fall_velocity = 0;
while (!self isOnGround())
{
was_on_ground = 0;
vel = self getVelocity();
self.fall_velocity = vel[2];
wait 0.05;
}
if (!was_on_ground)
{
continue;
}
wait 0.05;
}
}
remove_fast_melee()
{
self endon("disconnect");
while (1)
{
if (self isMeleeing() && self getWeaponAmmoClip(self getCurrentWeapon()) == 0)
{
self disableWeaponCycling();
while (self isMeleeing())
{
wait 0.05;
}
if (is_player_valid(self) && !self.is_drinking)
{
self enableWeaponCycling();
}
continue;
}
wait 0.05;
}
}
player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime )
{
if (smeansofdeath == "MOD_FALLING")
{
// remove fall damage being based off max health
ratio = self.maxhealth / 100;
idamage = int(idamage / ratio);
// increase fall damage beyond 110
if (idamage >= 110)
{
min_velocity = 420;
max_velocity = 740;
if (self.divetoprone)
{
min_velocity = 300;
max_velocity = 560;
}
diff_velocity = max_velocity - min_velocity;
velocity = abs(self.fall_velocity);
if (velocity < min_velocity)
{
velocity = min_velocity;
}
idamage = int(((velocity - min_velocity) / diff_velocity) * 110);
}
}
return idamage;
}
disable_high_round_walkers()
{
level.speed_change_round = undefined;
}
disable_bank()
{
for(i = 0; i < level._unitriggers.trigger_stubs.size; i++)
{
if(IsDefined(level._unitriggers.trigger_stubs[i].targetname))
{
if(level._unitriggers.trigger_stubs[i].targetname == "bank_deposit" || level._unitriggers.trigger_stubs[i].targetname == "bank_withdraw")
{
maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( level._unitriggers.trigger_stubs[i] );
}
}
}
level notify( "stop_bank_teller" );
bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" );
if(IsDefined(bank_teller_dmg_trig))
{
bank_teller_transfer_trig = getent( bank_teller_dmg_trig.target, "targetname" );
bank_teller_dmg_trig delete();
bank_teller_transfer_trig delete();
}
}
bank_clear_account_value()
{
self.account_value = 0;
self maps/mp/zombies/_zm_stats::set_map_stat( "depositBox", player.account_value, level.banking_map );
}
disable_weapon_locker()
{
for(i = 0; i < level._unitriggers.trigger_stubs.size; i++)
{
if(IsDefined(level._unitriggers.trigger_stubs[i].targetname))
{
if(level._unitriggers.trigger_stubs[i].targetname == "weapon_locker")
{
maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( level._unitriggers.trigger_stubs[i] );
}
}
}
}
weapon_locker_clear_stored_weapondata()
{
if ( level.weapon_locker_online )
{
self maps/mp/zombies/_zm_stats::clear_stored_weapondata( level.weapon_locker_map );
}
else
{
self.stored_weapon_data = undefined;
}
}
disable_pers_upgrades()
{
level waittill("initial_disable_player_pers_upgrades");
level.pers_upgrades_keys = [];
level.pers_upgrades = [];
}
disable_player_pers_upgrades()
{
flag_wait( "initial_blackscreen_passed" );
if (isDefined(self.pers_upgrades_awarded))
{
upgrade = getFirstArrayKey(self.pers_upgrades_awarded);
while (isDefined(upgrade))
{
self.pers_upgrades_awarded[upgrade] = 0;
upgrade = getNextArrayKey(self.pers_upgrades_awarded, upgrade);
}
}
if (isDefined(level.pers_upgrades_keys))
{
index = 0;
while (index < level.pers_upgrades_keys.size)
{
str_name = level.pers_upgrades_keys[index];
stat_index = 0;
while (stat_index < level.pers_upgrades[str_name].stat_names.size)
{
self maps/mp/zombies/_zm_stats::zero_client_stat(level.pers_upgrades[str_name].stat_names[stat_index], 0);
stat_index++;
}
index++;
}
}
level notify("initial_disable_player_pers_upgrades");
}
disable_carpenter()
{
arrayremoveindex(level.zombie_include_powerups, "carpenter");
arrayremoveindex(level.zombie_powerups, "carpenter");
arrayremovevalue(level.zombie_powerup_array, "carpenter");
}
wallbuy_location_changes()
{
if(!is_classic())
{
if(level.scr_zm_map_start_location == "farm")
{
if(level.scr_zm_ui_gametype == "zstandard")
{
remove_wallbuy("tazer_knuckles_zm");
}
add_wallbuy("claymore_zm");
}
}
}
remove_wallbuy( name )
{
for(i = 0; i < level._unitriggers.trigger_stubs.size; i++)
{
if(IsDefined(level._unitriggers.trigger_stubs[i].zombie_weapon_upgrade) && level._unitriggers.trigger_stubs[i].zombie_weapon_upgrade == name)
{
maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( level._unitriggers.trigger_stubs[i] );
}
}
}
add_wallbuy( name )
{
struct = undefined;
spawnable_weapon_spawns = getstructarray( "weapon_upgrade", "targetname" );
spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "bowie_upgrade", "targetname" ), 1, 0 );
spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "sickle_upgrade", "targetname" ), 1, 0 );
spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "tazer_upgrade", "targetname" ), 1, 0 );
spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "buildable_wallbuy", "targetname" ), 1, 0 );
spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "claymore_purchase", "targetname" ), 1, 0 );
for(i = 0; i < spawnable_weapon_spawns.size; i++)
{
if(IsDefined(spawnable_weapon_spawns[i].zombie_weapon_upgrade) && spawnable_weapon_spawns[i].zombie_weapon_upgrade == name)
{
struct = spawnable_weapon_spawns[i];
break;
}
}
if(!IsDefined(struct))
{
return;
}
target_struct = getstruct( struct.target, "targetname" );
unitrigger_stub = spawnstruct();
unitrigger_stub.origin = struct.origin;
unitrigger_stub.angles = struct.angles;
tempmodel = spawn( "script_model", ( 0, 0, 0 ) );
tempmodel setmodel( target_struct.model );
tempmodel useweaponhidetags( struct.zombie_weapon_upgrade );
mins = tempmodel getmins();
maxs = tempmodel getmaxs();
absmins = tempmodel getabsmins();
absmaxs = tempmodel getabsmaxs();
bounds = absmaxs - absmins;
tempmodel delete();
unitrigger_stub.script_length = 64;
unitrigger_stub.script_width = bounds[1];
unitrigger_stub.script_height = bounds[2];
unitrigger_stub.origin -= anglesToRight( unitrigger_stub.angles ) * ( ( bounds[0] * 0.25 ) * 0.4 );
unitrigger_stub.target = struct.target;
unitrigger_stub.targetname = struct.targetname;
unitrigger_stub.cursor_hint = "HINT_NOICON";
if ( struct.targetname == "weapon_upgrade" )
{
unitrigger_stub.cost = maps/mp/zombies/_zm_weapons::get_weapon_cost( struct.zombie_weapon_upgrade );
if ( isDefined( level.monolingustic_prompt_format ) && !level.monolingustic_prompt_format )
{
unitrigger_stub.hint_string = maps/mp/zombies/_zm_weapons::get_weapon_hint( struct.zombie_weapon_upgrade );
unitrigger_stub.hint_parm1 = unitrigger_stub.cost;
return;
}
else
{
unitrigger_stub.hint_parm1 = maps/mp/zombies/_zm_weapons::get_weapon_display_name( struct.zombie_weapon_upgrade );
if ( isDefined( unitrigger_stub.hint_parm1 ) || unitrigger_stub.hint_parm1 == "" && unitrigger_stub.hint_parm1 == "none" )
{
unitrigger_stub.hint_parm1 = "missing weapon name " + struct.zombie_weapon_upgrade;
}
unitrigger_stub.hint_parm2 = unitrigger_stub.cost;
unitrigger_stub.hint_string = &"ZOMBIE_WEAPONCOSTONLY";
}
}
unitrigger_stub.weapon_upgrade = struct.zombie_weapon_upgrade;
unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
unitrigger_stub.require_look_at = 1;
if ( isDefined( struct.require_look_from ) && struct.require_look_from )
{
unitrigger_stub.require_look_from = 1;
}
unitrigger_stub.zombie_weapon_upgrade = struct.zombie_weapon_upgrade;
model = spawn( "script_model", struct.origin );
model.angles = struct.angles;
model.targetname = struct.target;
model setmodel( target_struct.model );
model useweaponhidetags( struct.zombie_weapon_upgrade );
model hide();
maps/mp/zombies/_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
if ( is_melee_weapon( unitrigger_stub.zombie_weapon_upgrade ) )
{
if ( unitrigger_stub.zombie_weapon_upgrade == "tazer_knuckles_zm" && isDefined( level.taser_trig_adjustment ) )
{
unitrigger_stub.origin += level.taser_trig_adjustment;
}
maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, maps/mp/zombies/_zm_weapons::weapon_spawn_think );
}
else if ( unitrigger_stub.zombie_weapon_upgrade == "claymore_zm" )
{
unitrigger_stub.prompt_and_visibility_func = maps/mp/zombies/_zm_weap_claymore::claymore_unitrigger_update_prompt;
maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, maps/mp/zombies/_zm_weap_claymore::buy_claymores );
model thread claymore_rotate_model_when_bought();
}
else
{
unitrigger_stub.prompt_and_visibility_func = maps/mp/zombies/_zm_weapons::wall_weapon_update_prompt;
maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, maps/mp/zombies/_zm_weapons::weapon_spawn_think );
}
struct.trigger_stub = unitrigger_stub;
chalk_fx = name + "_fx";
thread playchalkfx( chalk_fx, struct.origin, struct.angles );
}
playchalkfx( effect, origin, angles )
{
while ( 1 )
{
fx = SpawnFX( level._effect[ effect ], origin, AnglesToForward( angles ), AnglesToUp( angles ) );
TriggerFX( fx );
level waittill( "connected", player );
fx Delete();
}
}
claymore_rotate_model_when_bought()
{
og_origin = self.origin;
while (og_origin == self.origin)
{
wait 0.05;
}
self.angles += ( 0, 90, 0 );
}
wallbuy_cost_changes()
{
flag_wait( "initial_blackscreen_passed" );
if (isDefined(level.zombie_weapons["beretta93r_zm"]))
{
cost = 900;
level.zombie_weapons["beretta93r_zm"].cost = cost;
level.zombie_weapons["beretta93r_zm"].ammo_cost = int(cost / 2);
}
if (isDefined(level.zombie_weapons["870mcs_zm"]))
{
cost = 1200;
level.zombie_weapons["870mcs_zm"].cost = cost;
level.zombie_weapons["870mcs_zm"].ammo_cost = int(cost / 2);
}
if (isDefined(level.zombie_weapons["an94_zm"]))
{
cost = 1500;
level.zombie_weapons["an94_zm"].cost = cost;
level.zombie_weapons["an94_zm"].ammo_cost = int(cost / 2);
}
if (isDefined(level.zombie_weapons["thompson_zm"]))
{
level.zombie_weapons["thompson_zm"].ammo_cost = 750;
}
}
wallbuy_increase_trigger_radius()
{
for(i = 0; i < level._unitriggers.trigger_stubs.size; i++)
{
if(IsDefined(level._unitriggers.trigger_stubs[i].zombie_weapon_upgrade))
{
level._unitriggers.trigger_stubs[i].script_length = 64;
}
}
}
wallbuy_dynamic_increase_trigger_radius()
{
if(!(is_classic() && level.scr_zm_map_start_location == "processing"))
{
return;
}
while (!isDefined(level.built_wallbuys))
{
wait 0.5;
}
prev_built_wallbuys = 0;
while (1)
{
if (level.built_wallbuys > prev_built_wallbuys)
{
prev_built_wallbuys = level.built_wallbuys;
wallbuy_increase_trigger_radius();
}
if (level.built_wallbuys == -100)
{
wallbuy_increase_trigger_radius();
return;
}
wait 0.5;
}
}
disable_perk_pause()
{
for (i = 0; i < level.powered_items.size; i++)
{
item = level.powered_items[i];
if (IsDefined(item.target) && IsDefined(item.target.targetname) && item.target.targetname == "zombie_vending")
{
if (item.target.script_noteworthy != "specialty_weapupgrade")
{
item.power_off_func = ::perk_power_off;
}
}
}
}
perk_power_off( origin, radius )
{
self.target notify( "death" );
if (flag("solo_game") && isDefined(self.target.script_noteworthy) && self.target.script_noteworthy == "specialty_quickrevive")
{
self.target thread solo_revive_trigger_think();
}
else
{
self.target thread maps/mp/zombies/_zm_perks::vending_trigger_think();
}
if ( isDefined( self.target.perk_hum ) )
{
self.target.perk_hum delete();
}
//maps/mp/zombies/_zm_perks::perk_pause( self.target.script_noteworthy );
level notify( self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify() + "_off" );
}
enable_free_perks_before_power()
{
level.disable_free_perks_before_power = undefined;
}
buildbuildables()
{
// need a wait or else some buildables dont build
wait 1;
if(is_classic())
{
if(level.scr_zm_map_start_location == "transit")
{
buildbuildable( "turbine" );
buildbuildable( "electric_trap" );
buildbuildable( "turret" );
buildbuildable( "riotshield_zm" );
buildbuildable( "jetgun_zm" );
buildbuildable( "powerswitch", 1 );
buildbuildable( "pap", 1 );
buildbuildable( "sq_common", 1 );
// power switch is not showing up from forced build
show_powerswitch();
}
else if(level.scr_zm_map_start_location == "rooftop")
{
buildbuildable( "slipgun_zm" );
buildbuildable( "springpad_zm" );
buildbuildable( "sq_common", 1 );
}
else if(level.scr_zm_map_start_location == "processing")
{
level waittill( "buildables_setup" ); // wait for buildables to randomize
wait 0.05;
level.buildables_available = array("subwoofer_zm", "springpad_zm", "headchopper_zm");
removebuildable( "keys_zm" );
buildbuildable( "turbine" );
buildbuildable( "subwoofer_zm" );
buildbuildable( "springpad_zm" );
buildbuildable( "headchopper_zm" );
buildbuildable( "sq_common", 1 );
}
}
else
{
if(level.scr_zm_map_start_location == "street")
{
flag_wait( "initial_blackscreen_passed" ); // wait for buildables to be built
wait 1;
updatebuildables();
removebuildable( "turbine", 1 );
}
}
}
buildbuildable( buildable, craft )
{
if (!isDefined(craft))
{
craft = 0;
}
player = get_players()[ 0 ];
foreach (stub in level.buildable_stubs)
{
if ( !isDefined( buildable ) || stub.equipname == buildable )
{
if ( isDefined( buildable ) || stub.persistent != 3 )
{
equipname = stub get_equipname();
stub.cost = 1000;
stub.trigger_hintstring = "Hold ^3[{+activate}]^7 for " + equipname + " [Cost: " + stub.cost + "]";
stub.trigger_func = ::buildable_place_think;
if (craft)
{
stub maps/mp/zombies/_zm_buildables::buildablestub_finish_build( player );
stub maps/mp/zombies/_zm_buildables::buildablestub_remove();
stub.model notsolid();
stub.model show();
}
else
{
level.zombie_buildables[stub.equipname].hint = "Hold ^3[{+activate}]^7 to craft " + equipname;
stub.prompt_and_visibility_func = ::buildabletrigger_update_prompt;
}
i = 0;
foreach (piece in stub.buildablezone.pieces)
{
piece maps/mp/zombies/_zm_buildables::piece_unspawn();
if (!craft && i > 0)
{
stub.buildablezone maps/mp/zombies/_zm_buildables::buildable_set_piece_built(piece);
}
i++;
}
return;
}
}
}
}
get_equipname()
{
if (self.equipname == "turbine")
{
return "Turbine";
}
else if (self.equipname == "turret")
{
return "Turret";
}
else if (self.equipname == "electric_trap")
{
return "Electric Trap";
}
else if (self.equipname == "riotshield_zm")
{
return "Zombie Shield";
}
else if (self.equipname == "jetgun_zm")
{
return "Jet Gun";
}
else if (self.equipname == "slipgun_zm")
{
return "Sliquifier";
}
else if (self.equipname == "subwoofer_zm")
{
return "Subsurface Resonator";
}
else if (self.equipname == "springpad_zm")
{
return "Trample Steam";
}
else if (self.equipname == "headchopper_zm")
{
return "Head Chopper";
}
}
buildable_place_think()
{
self endon( "kill_trigger" );
player_built = undefined;
while ( isDefined( self.stub.built ) && !self.stub.built )
{
self waittill( "trigger", player );
if ( player != self.parent_player )
{
continue;
}
if ( isDefined( player.screecher_weapon ) )
{
continue;
}
if ( !is_player_valid( player ) )
{
player thread ignore_triggers( 0.5 );
}
status = player maps/mp/zombies/_zm_buildables::player_can_build( self.stub.buildablezone );
if ( !status )
{
self.stub.hint_string = "";
self sethintstring( self.stub.hint_string );
if ( isDefined( self.stub.oncantuse ) )
{
self.stub [[ self.stub.oncantuse ]]( player );
}
continue;
}
else
{
if ( isDefined( self.stub.onbeginuse ) )
{
self.stub [[ self.stub.onbeginuse ]]( player );
}
result = self maps/mp/zombies/_zm_buildables::buildable_use_hold_think( player );
team = player.pers[ "team" ];
if ( isDefined( self.stub.onenduse ) )
{
self.stub [[ self.stub.onenduse ]]( team, player, result );
}
if ( !result )
{
continue;
}
if ( isDefined( self.stub.onuse ) )
{
self.stub [[ self.stub.onuse ]]( player );
}
prompt = player maps/mp/zombies/_zm_buildables::player_build( self.stub.buildablezone );
player_built = player;
self.stub.hint_string = prompt;
self sethintstring( self.stub.hint_string );
}
}
if ( isDefined( player_built ) )
{
}
if ( self.stub.persistent == 0 )
{
self.stub maps/mp/zombies/_zm_buildables::buildablestub_remove();
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.stub );
return;
}
if ( self.stub.persistent == 3 )
{
maps/mp/zombies/_zm_buildables::stub_unbuild_buildable( self.stub, 1 );
return;
}
if ( self.stub.persistent == 2 )
{
if ( isDefined( player_built ) )
{
self buildabletrigger_update_prompt( player_built );
}
if ( !maps/mp/zombies/_zm_weapons::limited_weapon_below_quota( self.stub.weaponname, undefined ) )
{
self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED";
self sethintstring( self.stub.hint_string );
return;
}
if ( isDefined( self.stub.bought ) && self.stub.bought )
{
self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX";
self sethintstring( self.stub.hint_string );
return;
}
if ( isDefined( self.stub.model ) )
{
self.stub.model notsolid();
self.stub.model show();
}
while ( self.stub.persistent == 2 )
{
self waittill( "trigger", player );
if ( isDefined( player.screecher_weapon ) )
{
continue;
}
if ( !maps/mp/zombies/_zm_weapons::limited_weapon_below_quota( self.stub.weaponname, undefined ) )
{
self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED";
self sethintstring( self.stub.hint_string );
return;
}
if ( isDefined( self.stub.built ) && !self.stub.built )
{
self.stub.hint_string = "";
self sethintstring( self.stub.hint_string );
return;
}
if ( player != self.parent_player )
{
continue;
}
if ( !is_player_valid( player ) )
{
player thread ignore_triggers( 0.5 );
}
if (player.score < self.stub.cost)
{
self play_sound_on_ent( "no_purchase" );
player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money_weapon" );
continue;
}
player maps/mp/zombies/_zm_score::minus_to_player_score( self.stub.cost );
self play_sound_on_ent( "purchase" );
self.stub.bought = 1;
if ( isDefined( self.stub.model ) )
{
self.stub.model thread maps/mp/zombies/_zm_buildables::model_fly_away();
}
player maps/mp/zombies/_zm_weapons::weapon_give( self.stub.weaponname );
if ( isDefined( level.zombie_include_buildables[ self.stub.equipname ].onbuyweapon ) )
{
self [[ level.zombie_include_buildables[ self.stub.equipname ].onbuyweapon ]]( player );
}
if ( !maps/mp/zombies/_zm_weapons::limited_weapon_below_quota( self.stub.weaponname, undefined ) )
{
self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED";
}
else
{
self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX";
}
self sethintstring( self.stub.hint_string );
player maps/mp/zombies/_zm_buildables::track_buildables_pickedup( self.stub.weaponname );
}
}
else while ( !isDefined( player_built ) || self buildabletrigger_update_prompt( player_built ) )
{
if ( isDefined( self.stub.model ) )
{
self.stub.model notsolid();
self.stub.model show();
}
while ( self.stub.persistent == 1 )
{
self waittill( "trigger", player );
if ( isDefined( player.screecher_weapon ) )
{
continue;
}
if ( isDefined( self.stub.built ) && !self.stub.built )
{
self.stub.hint_string = "";
self sethintstring( self.stub.hint_string );
return;
}
if ( player != self.parent_player )
{
continue;
}
if ( !is_player_valid( player ) )
{
player thread ignore_triggers( 0.5 );
}
if ( player has_player_equipment( self.stub.weaponname ) )
{
continue;
}
if (player.score < self.stub.cost)
{
self play_sound_on_ent( "no_purchase" );
player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money_weapon" );
continue;
}
if ( !maps/mp/zombies/_zm_equipment::is_limited_equipment( self.stub.weaponname ) || !maps/mp/zombies/_zm_equipment::limited_equipment_in_use( self.stub.weaponname ) )
{
player maps/mp/zombies/_zm_score::minus_to_player_score( self.stub.cost );
self play_sound_on_ent( "purchase" );
player maps/mp/zombies/_zm_equipment::equipment_buy( self.stub.weaponname );
player giveweapon( self.stub.weaponname );
player setweaponammoclip( self.stub.weaponname, 1 );
if ( isDefined( level.zombie_include_buildables[ self.stub.equipname ].onbuyweapon ) )
{
self [[ level.zombie_include_buildables[ self.stub.equipname ].onbuyweapon ]]( player );
}
if ( self.stub.weaponname != "keys_zm" )
{
player setactionslot( 1, "weapon", self.stub.weaponname );
}
if ( isDefined( level.zombie_buildables[ self.stub.equipname ].bought ) )
{
self.stub.hint_string = level.zombie_buildables[ self.stub.equipname ].bought;
}
else
{
self.stub.hint_string = "";
}
self sethintstring( self.stub.hint_string );
player maps/mp/zombies/_zm_buildables::track_buildables_pickedup( self.stub.weaponname );
continue;
}
else
{
self.stub.hint_string = "";
self sethintstring( self.stub.hint_string );
}
}
}
}
buildabletrigger_update_prompt( player )
{
can_use = 0;
if (isDefined(level.buildablepools))
{
can_use = self.stub pooledbuildablestub_update_prompt( player, self );
}
else
{
can_use = self.stub buildablestub_update_prompt( player, self );
}
self sethintstring( self.stub.hint_string );
if ( isDefined( self.stub.cursor_hint ) )
{
if ( self.stub.cursor_hint == "HINT_WEAPON" && isDefined( self.stub.cursor_hint_weapon ) )
{
self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon );
}
else
{
self setcursorhint( self.stub.cursor_hint );
}
}
return can_use;
}
buildablestub_update_prompt( player, trigger )
{
if ( !self maps/mp/zombies/_zm_buildables::anystub_update_prompt( player ) )
{
return 0;
}
if ( isDefined( self.buildablestub_reject_func ) )
{
rval = self [[ self.buildablestub_reject_func ]]( player );
if ( rval )
{
return 0;
}
}
if ( isDefined( self.custom_buildablestub_update_prompt ) && !( self [[ self.custom_buildablestub_update_prompt ]]( player ) ) )
{
return 0;
}
self.cursor_hint = "HINT_NOICON";
self.cursor_hint_weapon = undefined;
if ( isDefined( self.built ) && !self.built )
{
slot = self.buildablestruct.buildable_slot;
piece = self.buildablezone.pieces[0];
player maps/mp/zombies/_zm_buildables::player_set_buildable_piece(piece, slot);
if ( !isDefined( player maps/mp/zombies/_zm_buildables::player_get_buildable_piece( slot ) ) )
{
if ( isDefined( level.zombie_buildables[ self.equipname ].hint_more ) )
{
self.hint_string = level.zombie_buildables[ self.equipname ].hint_more;
}
else
{
self.hint_string = &"ZOMBIE_BUILD_PIECE_MORE";
}
return 0;
}
else
{
if ( !self.buildablezone maps/mp/zombies/_zm_buildables::buildable_has_piece( player maps/mp/zombies/_zm_buildables::player_get_buildable_piece( slot ) ) )
{
if ( isDefined( level.zombie_buildables[ self.equipname ].hint_wrong ) )
{
self.hint_string = level.zombie_buildables[ self.equipname ].hint_wrong;
}
else
{
self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG";
}
return 0;
}
else
{
if ( isDefined( level.zombie_buildables[ self.equipname ].hint ) )
{
self.hint_string = level.zombie_buildables[ self.equipname ].hint;
}
else
{
self.hint_string = "Missing buildable hint";
}
}
}
}
else
{
if ( self.persistent == 1 )
{
if ( maps/mp/zombies/_zm_equipment::is_limited_equipment( self.weaponname ) && maps/mp/zombies/_zm_equipment::limited_equipment_in_use( self.weaponname ) )
{
self.hint_string = &"ZOMBIE_BUILD_PIECE_ONLY_ONE";
return 0;
}
if ( player has_player_equipment( self.weaponname ) )
{
self.hint_string = &"ZOMBIE_BUILD_PIECE_HAVE_ONE";
return 0;
}
self.hint_string = self.trigger_hintstring;
}
else if ( self.persistent == 2 )
{
if ( !maps/mp/zombies/_zm_weapons::limited_weapon_below_quota( self.weaponname, undefined ) )
{
self.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED";
return 0;
}
else
{
if ( isDefined( self.bought ) && self.bought )
{
self.hint_string = &"ZOMBIE_GO_TO_THE_BOX";
return 0;
}
}
self.hint_string = self.trigger_hintstring;
}
else
{
self.hint_string = "";
return 0;
}
}
return 1;
}
pooledbuildablestub_update_prompt( player, trigger )
{
if ( !self maps/mp/zombies/_zm_buildables::anystub_update_prompt( player ) )
{
return 0;
}
if ( isDefined( self.custom_buildablestub_update_prompt ) && !( self [[ self.custom_buildablestub_update_prompt ]]( player ) ) )
{
return 0;
}
self.cursor_hint = "HINT_NOICON";
self.cursor_hint_weapon = undefined;
if ( isDefined( self.built ) && !self.built )
{
trigger thread buildablestub_build_succeed();
if (level.buildables_available.size > 1)
{
self thread choose_open_buildable(player);
}
slot = self.buildablestruct.buildable_slot;
if (self.buildables_available_index >= level.buildables_available.size)
{
self.buildables_available_index = 0;
}
foreach (stub in level.buildable_stubs)
{
if (stub.buildablezone.buildable_name == level.buildables_available[self.buildables_available_index])
{
piece = stub.buildablezone.pieces[0];
break;
}
}
player maps/mp/zombies/_zm_buildables::player_set_buildable_piece(piece, slot);
piece = player maps/mp/zombies/_zm_buildables::player_get_buildable_piece(slot);
if ( !isDefined( piece ) )
{
if ( isDefined( level.zombie_buildables[ self.equipname ].hint_more ) )
{
self.hint_string = level.zombie_buildables[ self.equipname ].hint_more;
}
else
{
self.hint_string = &"ZOMBIE_BUILD_PIECE_MORE";
}
if ( isDefined( level.custom_buildable_need_part_vo ) )
{
player thread [[ level.custom_buildable_need_part_vo ]]();
}
return 0;
}
else
{
if ( isDefined( self.bound_to_buildable ) && !self.bound_to_buildable.buildablezone maps/mp/zombies/_zm_buildables::buildable_has_piece( piece ) )
{
if ( isDefined( level.zombie_buildables[ self.bound_to_buildable.equipname ].hint_wrong ) )
{
self.hint_string = level.zombie_buildables[ self.bound_to_buildable.equipname ].hint_wrong;
}
else
{
self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG";
}
if ( isDefined( level.custom_buildable_wrong_part_vo ) )
{
player thread [[ level.custom_buildable_wrong_part_vo ]]();
}
return 0;
}
else
{
if ( !isDefined( self.bound_to_buildable ) && !self.buildable_pool pooledbuildable_has_piece( piece ) )
{
if ( isDefined( level.zombie_buildables[ self.equipname ].hint_wrong ) )
{
self.hint_string = level.zombie_buildables[ self.equipname ].hint_wrong;
}
else
{
self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG";
}
return 0;
}
else
{
if ( isDefined( self.bound_to_buildable ) )
{
if ( isDefined( level.zombie_buildables[ piece.buildablename ].hint ) )
{
self.hint_string = level.zombie_buildables[ piece.buildablename ].hint;
}
else
{
self.hint_string = "Missing buildable hint";
}
}
if ( isDefined( level.zombie_buildables[ piece.buildablename ].hint ) )
{
self.hint_string = level.zombie_buildables[ piece.buildablename ].hint;
}
else
{
self.hint_string = "Missing buildable hint";
}
}
}
}
}
else
{
return trigger [[ self.original_prompt_and_visibility_func ]]( player );
}
return 1;
}
pooledbuildable_has_piece( piece )
{
return isDefined( self pooledbuildable_stub_for_piece( piece ) );
}
pooledbuildable_stub_for_piece( piece )
{
foreach (stub in self.stubs)
{
if ( !isDefined( stub.bound_to_buildable ) )
{
if ( stub.buildablezone maps/mp/zombies/_zm_buildables::buildable_has_piece( piece ) )
{
return stub;
}
}
}
return undefined;
}
choose_open_buildable( player )
{
self endon( "kill_choose_open_buildable" );
n_playernum = player getentitynumber();
b_got_input = 1;
hinttexthudelem = newclienthudelem( player );
hinttexthudelem.alignx = "center";
hinttexthudelem.aligny = "middle";
hinttexthudelem.horzalign = "center";
hinttexthudelem.vertalign = "bottom";
hinttexthudelem.y = -100;
hinttexthudelem.foreground = 1;
hinttexthudelem.font = "default";
hinttexthudelem.fontscale = 1;
hinttexthudelem.alpha = 1;
hinttexthudelem.color = ( 1, 1, 1 );
hinttexthudelem settext( "Press [{+actionslot 1}] or [{+actionslot 2}] to change item" );
if (!isDefined(self.buildables_available_index))
{
self.buildables_available_index = 0;
}
while ( isDefined( self.playertrigger[ n_playernum ] ) && !self.built )
{
if (!player isTouching(self.playertrigger[n_playernum]))
{
hinttexthudelem.alpha = 0;
wait 0.05;
continue;
}
hinttexthudelem.alpha = 1;
if ( player actionslotonebuttonpressed() )
{
self.buildables_available_index++;
b_got_input = 1;
}
else
{
if ( player actionslottwobuttonpressed() )
{
self.buildables_available_index--;
b_got_input = 1;
}
}
if ( self.buildables_available_index >= level.buildables_available.size )
{
self.buildables_available_index = 0;
}
else
{
if ( self.buildables_available_index < 0 )
{
self.buildables_available_index = level.buildables_available.size - 1;
}
}
if ( b_got_input )
{
piece = undefined;
foreach (stub in level.buildable_stubs)
{
if (stub.buildablezone.buildable_name == level.buildables_available[self.buildables_available_index])
{
piece = stub.buildablezone.pieces[0];
break;
}
}
slot = self.buildablestruct.buildable_slot;
player maps/mp/zombies/_zm_buildables::player_set_buildable_piece(piece, slot);
self.equipname = level.buildables_available[self.buildables_available_index];
self.hint_string = level.zombie_buildables[self.equipname].hint;
self.playertrigger[n_playernum] sethintstring(self.hint_string);
b_got_input = 0;
}
if ( player is_player_looking_at( self.playertrigger[n_playernum].origin, 0.76 ) )
{
hinttexthudelem.alpha = 1;
}
else
{
hinttexthudelem.alpha = 0;
}
wait 0.05;
}
hinttexthudelem destroy();
}
buildablestub_build_succeed()
{
self notify("buildablestub_build_succeed");
self endon("buildablestub_build_succeed");
self waittill( "build_succeed" );
self.stub maps/mp/zombies/_zm_buildables::buildablestub_remove();
arrayremovevalue(level.buildables_available, self.stub.buildablezone.buildable_name);
if (level.buildables_available.size == 0)
{
foreach (stub in level.buildable_stubs)
{
switch(stub.equipname)
{
case "turbine":
case "subwoofer_zm":
case "springpad_zm":
case "headchopper_zm":
maps/mp/zombies/_zm_unitrigger::unregister_unitrigger(stub);
break;
}
}
}
}
// adds updated hintstring and functionality
updatebuildables()
{
foreach (stub in level._unitriggers.trigger_stubs)
{
if(IsDefined(stub.equipname))
{
equipname = stub get_equipname();
stub.cost = 1000;
stub.trigger_hintstring = "Hold ^3[{+activate}]^7 for " + equipname + " [Cost: " + stub.cost + "]";
stub.trigger_func = ::buildable_place_think;
}
}
}
removebuildable( buildable, after_built )
{
if (!isDefined(after_built))
{
after_built = 0;
}
if (after_built)
{
foreach (stub in level._unitriggers.trigger_stubs)
{
if(IsDefined(stub.equipname) && stub.equipname == buildable)
{
stub.model hide();
maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( stub );
return;
}
}
}
else
{
foreach (stub in level.buildable_stubs)
{
if ( !isDefined( buildable ) || stub.equipname == buildable )
{
if ( isDefined( buildable ) || stub.persistent != 3 )
{
stub maps/mp/zombies/_zm_buildables::buildablestub_remove();
foreach (piece in stub.buildablezone.pieces)
{
piece maps/mp/zombies/_zm_buildables::piece_unspawn();
}
maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( stub );
return;
}
}
}
}
}
buildable_piece_remove_on_last_stand()
{
self endon( "disconnect" );
self thread buildable_get_last_piece();
while (1)
{
self waittill("entering_last_stand");
if (isDefined(self.last_piece))
{
self.last_piece maps/mp/zombies/_zm_buildables::piece_unspawn();
}
}
}
buildable_get_last_piece()
{
self endon( "disconnect" );
while (1)
{
if (!self maps/mp/zombies/_zm_laststand::player_is_in_laststand())
{
self.last_piece = maps/mp/zombies/_zm_buildables::player_get_buildable_piece(0);
}
wait 0.05;
}
}
// MOTD/Origins style buildables
buildcraftables()
{
// need a wait or else some buildables dont build
wait 1;
if(is_classic())
{
if(level.scr_zm_map_start_location == "prison")
{
buildcraftable( "alcatraz_shield_zm" );
buildcraftable( "packasplat" );
changecraftableoption( 0 );
}
else if(level.scr_zm_map_start_location == "tomb")
{
buildcraftable( "tomb_shield_zm" );
buildcraftable( "equip_dieseldrone_zm" );
takecraftableparts( "gramophone" );
}
}
}
changecraftableoption( index )
{
foreach (craftable in level.a_uts_craftables)
{
if (craftable.equipname == "open_table")
{
craftable thread setcraftableoption( index );
}
}
}
setcraftableoption( index )
{
self endon("death");
while (self.a_uts_open_craftables_available.size <= 0)
{
wait 0.05;
}
if (self.a_uts_open_craftables_available.size > 1)
{
self.n_open_craftable_choice = index;
self.equipname = self.a_uts_open_craftables_available[self.n_open_craftable_choice].equipname;
self.hint_string = self.a_uts_open_craftables_available[self.n_open_craftable_choice].hint_string;
foreach (trig in self.playertrigger)
{
trig sethintstring( self.hint_string );
}
}
}
takecraftableparts( buildable )
{
player = get_players()[ 0 ];
foreach (stub in level.zombie_include_craftables)
{
if ( stub.name == buildable )
{
foreach (piece in stub.a_piecestubs)
{
piecespawn = piece.piecespawn;
if ( isDefined( piecespawn ) )
{
player player_take_piece( piecespawn );
}
}
return;
}
}
}
buildcraftable( buildable )
{
player = get_players()[ 0 ];
foreach (stub in level.a_uts_craftables)
{
if ( stub.craftablestub.name == buildable )
{
foreach (piece in stub.craftablespawn.a_piecespawns)
{
piecespawn = get_craftable_piece( stub.craftablestub.name, piece.piecename );
if ( isDefined( piecespawn ) )
{
player player_take_piece( piecespawn );
}
}
return;
}
}
}
get_craftable_piece( str_craftable, str_piece )
{
foreach (uts_craftable in level.a_uts_craftables)
{
if ( uts_craftable.craftablestub.name == str_craftable )
{
foreach (piecespawn in uts_craftable.craftablespawn.a_piecespawns)
{
if ( piecespawn.piecename == str_piece )
{
return piecespawn;
}
}
}
}
return undefined;
}
player_take_piece( piecespawn )
{
piecestub = piecespawn.piecestub;
damage = piecespawn.damage;
if ( isDefined( piecestub.onpickup ) )
{
piecespawn [[ piecestub.onpickup ]]( self );
}
if ( isDefined( piecestub.is_shared ) && piecestub.is_shared )
{
if ( isDefined( piecestub.client_field_id ) )
{
level setclientfield( piecestub.client_field_id, 1 );
}
}
else
{
if ( isDefined( piecestub.client_field_state ) )
{
self setclientfieldtoplayer( "craftable", piecestub.client_field_state );
}
}
piecespawn piece_unspawn();
piecespawn notify( "pickup" );
if ( isDefined( piecestub.is_shared ) && piecestub.is_shared )
{
piecespawn.in_shared_inventory = 1;
}
self adddstat( "buildables", piecespawn.craftablename, "pieces_pickedup", 1 );
}
piece_unspawn()
{
if ( isDefined( self.model ) )
{
self.model delete();
}
self.model = undefined;
if ( isDefined( self.unitrigger ) )
{
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger );
}
self.unitrigger = undefined;
}
remove_buildable_pieces( buildable_name )
{
foreach (buildable in level.zombie_include_buildables)
{
if(IsDefined(buildable.name) && buildable.name == buildable_name)
{
pieces = buildable.buildablepieces;
for(i = 0; i < pieces.size; i++)
{
pieces[i] maps/mp/zombies/_zm_buildables::piece_unspawn();
}
return;
}
}
}
enemies_ignore_equipments()
{
equipment = getFirstArrayKey(level.zombie_include_equipment);
while (isDefined(equipment))
{
maps/mp/zombies/_zm_equipment::enemies_ignore_equipment(equipment);
equipment = getNextArrayKey(level.zombie_include_equipment, equipment);
}
}
electric_trap_always_kill()
{
level.etrap_damage = maps/mp/zombies/_zm::ai_zombie_health( 255 );
}
jetgun_increase_grind_range()
{
level.zombies_vars["jetgun_grind_range"] = 256;
}
jetgun_fast_cooldown()
{
self endon( "disconnect" );
if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "jetgun_zm" ) )
{
return;
}
while ( 1 )
{
if (!IsDefined(self.jetgun_heatval))
{
wait 0.05;
continue;
}
if ( self getcurrentweapon() == "jetgun_zm" )
{
if (self AttackButtonPressed())
{
if (self IsMeleeing())
{
self.jetgun_heatval += .875; // have to add .025 if holding weapon
if (self.jetgun_heatval > 100)
{
self.jetgun_heatval = 100;
}
self setweaponoverheating( self.jetgun_overheating, self.jetgun_heatval );
}
}
else
{
self.jetgun_heatval -= .075; // have to add .025 if holding weapon
if (self.jetgun_heatval < 0)
{
self.jetgun_heatval = 0;
}
self setweaponoverheating( self.jetgun_overheating, self.jetgun_heatval );
}
}
else
{
self.jetgun_heatval -= .1;
if (self.jetgun_heatval < 0)
{
self.jetgun_heatval = 0;
}
}
wait 0.05;
}
}
jetgun_fast_spinlerp()
{
self endon( "disconnect" );
if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "jetgun_zm" ) )
{
return;
}
previous_spinlerp = 0;
while ( 1 )
{
if ( self getcurrentweapon() == "jetgun_zm" )
{
if (self AttackButtonPressed() && !self IsSwitchingWeapons())
{
previous_spinlerp -= 0.0166667;
if (previous_spinlerp < -1)
{
previous_spinlerp = -1;
}
if (self IsMeleeing())
{
self setcurrentweaponspinlerp(previous_spinlerp / 2);
}
else
{
self setcurrentweaponspinlerp(previous_spinlerp);
}
}
else
{
previous_spinlerp += 0.01;
if (previous_spinlerp > 0)
{
previous_spinlerp = 0;
}
self setcurrentweaponspinlerp(0);
}
}
else
{
previous_spinlerp = 0;
}
wait 0.05;
}
}
jetgun_disable_explode_overheat()
{
level.explode_overheated_jetgun = false;
level.unbuild_overheated_jetgun = false;
level.take_overheated_jetgun = true;
}
jetgun_overheated_fix()
{
self endon( "disconnect" );
if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "jetgun_zm" ) )
{
return;
}
while ( 1 )
{
self waittill( "jetgun_overheated" );
weapon_org = self gettagorigin( "tag_weapon" );
self dodamage( 50, weapon_org );
self playsound( "wpn_jetgun_explo" );
wait 0.05;
self.jetgun_heatval = 100;
self.jetgun_overheating = 0;
}
}
jetgun_remove_forced_weapon_switch()
{
foreach (buildable in level.zombie_include_buildables)
{
if(IsDefined(buildable.name) && buildable.name == "jetgun_zm")
{
buildable.onbuyweapon = undefined;
return;
}
}
}
jetgun_remove_drop_fn()
{
level.zombie_equipment["jetgun_zm"].drop_fn = undefined;
}
slipgun_always_kill()
{
level.slipgun_damage = maps/mp/zombies/_zm::ai_zombie_health( 255 );
}
slipgun_disable_reslip()
{
level.zombie_vars["slipgun_reslip_rate"] = 0;
}
on_equipment_placed()
{
self endon( "disconnect" );
//level.equipment_etrap_needs_power = 0;
//level.equipment_turret_needs_power = 0;
//level.equipment_subwoofer_needs_power = 0;
for ( ;; )
{
self waittill( "equipment_placed", weapon, weapname );
if ( (IsDefined(level.turret_name) && weapname == level.turret_name) || (IsDefined(level.electrictrap_name) && weapname == level.electrictrap_name) || (IsDefined(level.subwoofer_name) && weapname == level.subwoofer_name) )
{
weapon.local_power = maps/mp/zombies/_zm_power::add_local_power( weapon.origin, 16 );
weapon thread remove_local_power_on_death(weapon.local_power);
if ( IsDefined(level.turret_name) && weapname == level.turret_name )
{
self thread turret_decay(weapon);
self thread turret_disable_team_damage(weapon);
self thread turret_stop_loop_sound(weapon);
}
else if ( IsDefined(level.electrictrap_name) && weapname == level.electrictrap_name )
{
self thread electrictrap_decay(weapon);
}
wait 0.05;
weapon.power_on = 1; // removes print statement made by equipment without power
if ( IsDefined(level.electrictrap_name) && weapname == level.electrictrap_name )
{
weapon.power_on_time -= 2000; // makes it so trap kills immediately when placed
}
}
}
}
remove_local_power_on_death( local_power )
{
while ( isDefined(self) )
{
wait 0.05;
}
maps/mp/zombies/_zm_power::end_local_power( local_power );
}
turret_disable_team_damage( weapon )
{
self endon ( "death" );
weapon endon( "death" );
while ( !IsDefined( weapon.turret ) )
{
wait 0.05;
}
weapon.turret.damage_own_team = 0;
}
turret_decay( weapon )
{
self endon( "death" );
self endon( "disconnect" );
if ( !isDefined( self.turret_health ) )
{
self.turret_health = 60;
}
while ( isDefined( weapon ) )
{
if ( weapon.power_on )
{
self.turret_health--;
if ( self.turret_health <= 0 )
{
self thread turret_expired( weapon );
return;
}
}
wait 1;
}
}
turret_expired( weapon )
{
maps/mp/zombies/_zm_equipment::equipment_disappear_fx( weapon.origin );
self cleanupoldturret();
self maps/mp/zombies/_zm_equipment::equipment_release( level.turret_name );
self.turret_health = undefined;
}
cleanupoldturret()
{
if ( isDefined( self.buildableturret ) )
{
if ( isDefined( self.buildableturret.stub ) )
{
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildableturret.stub );
self.buildableturret.stub = undefined;
}
if ( isDefined( self.buildableturret.turret ) )
{
if ( isDefined( self.buildableturret.turret.sound_ent ) )
{
self.buildableturret.turret.sound_ent delete();
}
self.buildableturret.turret delete();
}
if ( isDefined( self.buildableturret.sound_ent ) )
{
self.buildableturret.sound_ent delete();
self.buildableturret.sound_ent = undefined;
}
self.buildableturret delete();
self.turret_health = undefined;
}
else
{
if ( isDefined( self.turret ) )
{
self.turret notify( "stop_burst_fire_unmanned" );
self.turret delete();
}
}
self.turret = undefined;
self notify( "turret_cleanup" );
}
turret_stop_loop_sound( weapon )
{
while(isDefined(weapon))
{
wait 0.05;
}
if ( isDefined( self.buildableturret.sound_ent ) )
{
self.buildableturret.sound_ent stoploopsound();
self.buildableturret.sound_ent playsoundwithnotify( "wpn_zmb_turret_stop", "sound_done" );
self.buildableturret.sound_ent waittill( "sound_done" );
self.buildableturret.sound_ent delete();
self.buildableturret.sound_ent = undefined;
}
}
electrictrap_decay( weapon )
{
self endon( "death" );
self endon( "disconnect" );
if ( !isDefined( self.electrictrap_health ) )
{
self.electrictrap_health = 60;
}
while ( isDefined( weapon ) )
{
if ( weapon.power_on )
{
self.electrictrap_health--;
if ( self.electrictrap_health <= 0 )
{
self thread electrictrap_expired( weapon );
return;
}
}
wait 1;
}
}
electrictrap_expired( weapon )
{
maps/mp/zombies/_zm_equipment::equipment_disappear_fx( weapon.origin );
self cleanupoldtrap();
self maps/mp/zombies/_zm_equipment::equipment_release( level.electrictrap_name );
self.electrictrap_health = undefined;
}
cleanupoldtrap()
{
if ( isDefined( self.buildableelectrictrap ) )
{
if ( isDefined( self.buildableelectrictrap.stub ) )
{
thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildableelectrictrap.stub );
self.buildableelectrictrap.stub = undefined;
}
self.buildableelectrictrap delete();
}
if ( isDefined( level.electrap_sound_ent ) )
{
level.electrap_sound_ent delete();
level.electrap_sound_ent = undefined;
}
}
give_additional_perks()
{
self endon( "disconnect" );
for ( ;; )
{
self waittill_any("perk_acquired", "perk_lost");
if (self HasPerk("specialty_fastreload"))
{
self SetPerk("specialty_fastads");
self SetPerk("specialty_fastweaponswitch");
self Setperk( "specialty_fasttoss" );
}
else
{
self UnsetPerk("specialty_fastads");
self UnsetPerk("specialty_fastweaponswitch");
self Unsetperk( "specialty_fasttoss" );
}
if (self HasPerk("specialty_deadshot"))
{
self SetPerk("specialty_stalker");
self Setperk( "specialty_sprintrecovery" );
self.pers_upgrades_awarded["multikill_headshots"] = 1; // double headshot damage
}
else
{
self UnsetPerk("specialty_stalker");
self Unsetperk( "specialty_sprintrecovery" );
self.pers_upgrades_awarded["multikill_headshots"] = 0;
}
if (self HasPerk("specialty_longersprint"))
{
self Setperk( "specialty_movefaster" );
}
else
{
self Unsetperk( "specialty_movefaster" );
}
}
}
disable_solo_revive()
{
level.using_solo_revive = 0;
}
solo_lives_fix()
{
self endon("disconnect");
if (!(is_classic() || is_standard()))
{
return;
}
if (isDefined(level.zombiemode_using_afterlife) && level.zombiemode_using_afterlife)
{
return;
}
flag_wait( "start_zombie_round_logic" );
if (!flag("solo_game"))
{
return;
}
self.lives = 3;
self.bought_solo_revive = 0;
saved_lives = self.lives;
while (1)
{
self waittill_any("perk_acquired", "perk_lost", "player_revived");
if (self hasPerk("specialty_finalstand"))
{
// fix for Who's Who giving Quick Revive when player hasn't purchased actual Quick Revive
if (!self.bought_solo_revive)
{
self unsetPerk("specialty_quickrevive");
}
self waittill("fake_revive");
has_revive = 0;
foreach (perk in self.loadout.perks)
{
if (perk == "specialty_quickrevive")
{
has_revive = 1;
break;
}
}
self waittill("chugabud_effects_cleanup");
still_has_revive = 0;
foreach (perk in self.perks_active)
{
if (perk == "specialty_quickrevive")
{
still_has_revive = 1;
break;
}
}
// fix to remove a solo revive if auto revived from Who's Who due to having Quick Revive
if (has_revive && !still_has_revive && saved_lives > 0)
{
saved_lives--;
}
// fix for Who's Who removing solo revives
self.lives = saved_lives;
}
saved_lives = self.lives;
if (self.perks_active.size < 1)
{
self unsetPerk("specialty_quickrevive");
self.bought_solo_revive = 0;
continue;
}
self setPerk("specialty_quickrevive");
has_revive = 0;
foreach (perk in self.perks_active)
{
if (perk == "specialty_quickrevive")
{
has_revive = 1;
break;
}
}
self.bought_solo_revive = has_revive;
}
}
solo_revive_trigger_fix()
{
if (!(is_classic() || is_standard()))
{
return;
}
if (isDefined(level.zombiemode_using_afterlife) && level.zombiemode_using_afterlife)
{
return;
}
flag_wait( "start_zombie_round_logic" );
if (!flag("solo_game"))
{
return;
}
if (level.script == "zm_nuked")
{
while (!isDefined(level.revive_machine_spawned) || !level.revive_machine_spawned)
{
wait 0.05;
}
}
revive_triggers = getentarray("specialty_quickrevive", "script_noteworthy");
foreach (trig in revive_triggers)
{
new_trig = spawn( "trigger_radius_use", trig.origin, 0, 40, 70 );
new_trig.targetname = trig.targetname;
new_trig.script_noteworthy = trig.script_noteworthy;
new_trig triggerignoreteam();
new_trig.clip = trig.clip;
new_trig.machine = trig.machine;
new_trig.bump = trig.bump;
new_trig.blocker_model = trig.blocker_model;
new_trig.script_int = trig.script_int;
new_trig.turn_on_notify = trig.turn_on_notify;
new_trig.script_sound = trig.script_sound;
new_trig.script_string = trig.script_string;
new_trig.script_label = trig.script_label;
new_trig.target = trig.target;
if (is_classic() && level.scr_zm_map_start_location == "tomb")
{
new_trig.str_zone_name = trig.str_zone_name;
level.zone_capture.zones[trig.str_zone_name].perk_machines["revive"] = new_trig;
level.zone_capture.zones[trig.str_zone_name].perk_fx_func = undefined;
}
trig delete();
new_trig thread solo_revive_trigger_think();
new_trig thread maps/mp/zombies/_zm_perks::electric_perks_dialog();
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( new_trig.script_noteworthy );
maps/mp/zombies/_zm_power::add_powered_item( maps/mp/zombies/_zm_power::perk_power_on, ::perk_power_off, maps/mp/zombies/_zm_power::perk_range, maps/mp/zombies/_zm_power::cost_low_if_local, 0, powered_on, new_trig );
}
}
solo_revive_trigger_think()
{
self endon( "death" );
wait 0.01;
perk = self.script_noteworthy;
solo = 0;
start_on = 0;
level.revive_machine_is_solo = 0;
self sethintstring( &"ZOMBIE_NEED_POWER" );
self setcursorhint( "HINT_NOICON" );
self usetriggerrequirelookat();
cost = 1500;
self.cost = cost;
if ( !start_on )
{
notify_name = perk + "_power_on";
level waittill( notify_name );
}
if ( !isDefined( level._perkmachinenetworkchoke ) )
{
level._perkmachinenetworkchoke = 0;
}
else
{
level._perkmachinenetworkchoke++;
}
i = 0;
while ( i < level._perkmachinenetworkchoke )
{
wait_network_frame();
i++;
}
self thread maps/mp/zombies/_zm_audio::perks_a_cola_jingle_timer();
self thread check_player_has_solo_revive( perk );
self sethintstring( &"ZOMBIE_PERK_QUICKREVIVE", cost );
for ( ;; )
{
self waittill( "trigger", player );
index = maps/mp/zombies/_zm_weapons::get_player_index( player );
if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() || isDefined( player.intermission ) && player.intermission )
{
continue;
}
else
{
if ( player in_revive_trigger() )
{
continue;
}
else if ( !player maps/mp/zombies/_zm_magicbox::can_buy_weapon() )
{
wait 0.1;
continue;
}
else if ( player isthrowinggrenade() )
{
wait 0.1;
continue;
}
else if ( player isswitchingweapons() )
{
wait 0.1;
continue;
}
else if ( player.is_drinking > 0 )
{
wait 0.1;
continue;
}
else if ( player.bought_solo_revive )
{
self playsound( "deny" );
player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 1 );
continue;
}
else if ( isDefined( level.custom_perk_validation ) )
{
valid = self [[ level.custom_perk_validation ]]( player );
if ( !valid )
{
continue;
}
}
current_cost = cost;
if ( player maps/mp/zombies/_zm_pers_upgrades_functions::is_pers_double_points_active() )
{
current_cost = player maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_double_points_cost( current_cost );
}
if ( player.score < current_cost )
{
self playsound( "evt_perk_deny" );
player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 );
continue;
}
else if ( player.num_perks >= player get_player_perk_purchase_limit() )
{
self playsound( "evt_perk_deny" );
player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "sigh" );
continue;
}
else
{
sound = "evt_bottle_dispense";
playsoundatposition( sound, self.origin );
player maps/mp/zombies/_zm_score::minus_to_player_score( current_cost, 1 );
player.perk_purchased = perk;
self thread maps/mp/zombies/_zm_audio::play_jingle_or_stinger( self.script_label );
self thread maps/mp/zombies/_zm_perks::vending_trigger_post_think( player, perk );
}
}
}
}
check_player_has_solo_revive( perk )
{
self endon( "death" );
dist = 16384;
while ( 1 )
{
players = get_players();
foreach (player in players)
{
if ( distancesquared( player.origin, self.origin ) < dist )
{
if ( !player.bought_solo_revive && !player in_revive_trigger() && !is_equipment_that_blocks_purchase( player getcurrentweapon() ) && !player hacker_active() )
{
self setinvisibletoplayer( player, 0 );
}
else
{
self setinvisibletoplayer( player, 1 );
}
}
}
wait 0.05;
}
}
highrise_solo_revive_fix()
{
if (!(is_classic() && level.scr_zm_map_start_location == "rooftop"))
{
return;
}
flag_wait( "start_zombie_round_logic" );
if (!flag("solo_game"))
{
return;
}
flag_wait( "perks_ready" );
flag_wait( "initial_blackscreen_passed" );
wait 1;
revive_elevator = undefined;
foreach (elevator in level.elevators)
{
if (elevator.body.perk_type == "vending_revive")
{
revive_elevator = elevator;
break;
}
}
revive_elevator.body.elevator_stop = 1;
revive_elevator.body.lock_doors = 1;
revive_elevator.body perkelevatordoor(0);
flag_wait( "power_on" );
revive_elevator.body.elevator_stop = 0;
revive_elevator.body.lock_doors = 0;
revive_elevator.body perkelevatordoor(1);
}
perkelevatordoor( set )
{
self endon( "death" );
animtime = 1;
if ( is_true( set ) )
{
self.door_state = set;
self setanim( level.perk_elevators_door_open_state, 1, animtime, 1 );
wait getanimlength( level.perk_elevators_door_open_state );
}
else
{
self.door_state = set;
self setanim( level.perk_elevators_door_close_state, 1, animtime, 1 );
wait getanimlength( level.perk_elevators_door_close_state );
}
self notify( "PerkElevatorDoor" );
}
disable_sniper_scope_sway()
{
self endon( "disconnect" );
self.sway_disabled = 0;
while (1)
{
if (!self hasPerk("specialty_deadshot"))
{
if (isads(self))
{
if (!self.sway_disabled)
{
self.sway_disabled = 1;
self setclientfieldtoplayer( "deadshot_perk", 1 );
}
}
else
{
if (self.sway_disabled)
{
self.sway_disabled = 0;
self setclientfieldtoplayer( "deadshot_perk", 0 );
}
}
}
wait 0.05;
}
}
tombstone_disable_suicide()
{
level.playersuicideallowed = undefined;
}
tombstone_spawn_changes()
{
level.tombstone_spawn_func = ::tombstone_spawn;
}
tombstone_spawn()
{
self endon("disconnect");
self endon("player_revived");
self waittill("bled_out");
dc = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 40 ) );
dc.angles = self.angles;
dc setmodel( "tag_origin" );
dc_icon = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 40 ) );
dc_icon.angles = self.angles;
dc_icon setmodel( "ch_tombstone1" );
dc_icon linkto( dc );
dc.icon = dc_icon;
dc.script_noteworthy = "player_tombstone_model";
dc.player = self;
self thread maps/mp/zombies/_zm_tombstone::tombstone_clear();
dc thread maps/mp/zombies/_zm_tombstone::tombstone_wobble();
dc thread maps/mp/zombies/_zm_tombstone::tombstone_revived( self );
result = self waittill_any_return( "player_revived", "spawned_player", "disconnect" );
if ( result == "player_revived" || result == "disconnect" )
{
dc notify( "tombstone_timedout" );
dc_icon unlink();
dc_icon delete();
dc delete();
return;
}
dc thread tombstone_timeout();
dc thread tombstone_grab();
}
tombstone_timeout()
{
self endon( "tombstone_grabbed" );
player = self.player;
result = player waittill_any_return("bled_out", "disconnect");
if (result != "disconnect")
{
player playsoundtoplayer( "zmb_tombstone_timer_out", player );
}
self notify( "tombstone_timedout" );
self.icon unlink();
self.icon delete();
self delete();
}
tombstone_grab()
{
self endon( "tombstone_timedout" );
wait 1;
while ( isDefined( self ) )
{
players = get_players();
i = 0;
while ( i < players.size )
{
if ( players[ i ].is_zombie )
{
i++;
continue;
}
else
{
if ( isDefined( self.player ) && players[ i ] == self.player )
{
dist = distance( players[ i ].origin, self.origin );
if ( dist < 64 )
{
playfx( level._effect[ "powerup_grabbed" ], self.origin );
playfx( level._effect[ "powerup_grabbed_wave" ], self.origin );
players[ i ] maps/mp/zombies/_zm_tombstone::tombstone_give();
wait 0.1;
playsoundatposition( "zmb_tombstone_grab", self.origin );
self stoploopsound();
self.icon unlink();
self.icon delete();
self delete();
self notify( "tombstone_grabbed" );
players[ i ] clientnotify( "dc0" );
players[ i ] notify( "dance_on_my_grave" );
}
}
}
i++;
}
wait_network_frame();
}
}
tombstone_save_perks()
{
self endon("disconnect");
while (1)
{
self waittill_any("perk_acquired", "perk_lost");
if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
{
continue;
}
if (isDefined(self.a_restoring_perks))
{
continue;
}
if (self hasPerk("specialty_scavenger"))
{
if ( isDefined( self.perks_active ) )
{
self.a_saved_perks = [];
self.a_saved_perks = arraycopy( self.perks_active );
}
else
{
self.a_saved_perks = self maps/mp/zombies/_zm_perks::get_perk_array( 0 );
}
}
else
{
self.a_saved_perks = undefined;
}
}
}
tombstone_restore_perks()
{
self endon("disconnect");
while (1)
{
self waittill( "player_revived" );
discard_tombstone = 0;
if ( isDefined( self.a_saved_perks ) && self.a_saved_perks.size >= 2 )
{
i = 0;
while ( i < self.a_saved_perks.size )
{
perk = self.a_saved_perks[ i ];
if ( perk == "specialty_scavenger" )
{
discard_tombstone = 1;
}
i++;
}
self.a_restoring_perks = 1;
size = self.a_saved_perks.size;
i = 0;
while ( i < size )
{
perk = self.a_saved_perks[ i ];
if ( perk == "specialty_scavenger" && discard_tombstone == 1 )
{
i++;
continue;
}
if ( !(perk == "specialty_quickrevive" && flag("solo_game")) )
{
if ( self hasperk( perk ) )
{
i++;
continue;
}
}
self maps/mp/zombies/_zm_perks::give_perk( perk );
wait_network_frame();
i++;
}
self.a_restoring_perks = undefined;
}
self.a_saved_perks = undefined;
}
}
additionalprimaryweapon_save_weapons()
{
self endon("disconnect");
while (1)
{
if (!self hasPerk("specialty_additionalprimaryweapon"))
{
self waittill("perk_acquired");
wait 0.05;
}
if (self hasPerk("specialty_additionalprimaryweapon"))
{
primaries = self getweaponslistprimaries();
if (primaries.size >= 3)
{
weapon = primaries[primaries.size - 1];
self.a_saved_weapon = maps/mp/zombies/_zm_weapons::get_player_weapondata(self, weapon);
}
else
{
self.a_saved_weapon = undefined;
}
}
wait 0.05;
}
}
additionalprimaryweapon_restore_weapons()
{
self endon("disconnect");
while (1)
{
self waittill("perk_acquired");
if (isDefined(self.a_saved_weapon) && self hasPerk("specialty_additionalprimaryweapon"))
{
pap_triggers = getentarray( "specialty_weapupgrade", "script_noteworthy" );
give_wep = 1;
if ( isDefined( self ) && self maps/mp/zombies/_zm_weapons::has_weapon_or_upgrade( self.a_saved_weapon["name"] ) )
{
give_wep = 0;
}
else if ( !maps/mp/zombies/_zm_weapons::limited_weapon_below_quota( self.a_saved_weapon["name"], self, pap_triggers ) )
{
give_wep = 0;
}
else if ( !self maps/mp/zombies/_zm_weapons::player_can_use_content( self.a_saved_weapon["name"] ) )
{
give_wep = 0;
}
else if ( isDefined( level.custom_magic_box_selection_logic ) )
{
if ( !( [[ level.custom_magic_box_selection_logic ]]( self.a_saved_weapon["name"], self, pap_triggers ) ) )
{
give_wep = 0;
}
}
else if ( isDefined( self ) && isDefined( level.special_weapon_magicbox_check ) )
{
give_wep = self [[ level.special_weapon_magicbox_check ]]( self.a_saved_weapon["name"] );
}
if (give_wep)
{
current_wep = self getCurrentWeapon();
self maps/mp/zombies/_zm_weapons::weapondata_give(self.a_saved_weapon);
self switchToWeapon(current_wep);
}
self.a_saved_weapon = undefined;
}
}
}
additionalprimaryweapon_indicator()
{
self endon("disconnect");
additionalprimaryweapon_indicator_hud = newClientHudElem(self);
additionalprimaryweapon_indicator_hud.alignx = "right";
additionalprimaryweapon_indicator_hud.aligny = "bottom";
additionalprimaryweapon_indicator_hud.horzalign = "user_right";
additionalprimaryweapon_indicator_hud.vertalign = "user_bottom";
if (level.script == "zm_highrise")
{
additionalprimaryweapon_indicator_hud.x -= 100;
additionalprimaryweapon_indicator_hud.y -= 80;
}
else if (level.script == "zm_tomb")
{
additionalprimaryweapon_indicator_hud.x -= 75;
additionalprimaryweapon_indicator_hud.y -= 60;
}
else
{
additionalprimaryweapon_indicator_hud.x -= 75;
additionalprimaryweapon_indicator_hud.y -= 80;
}
additionalprimaryweapon_indicator_hud.alpha = 0;
additionalprimaryweapon_indicator_hud.color = ( 1, 1, 1 );
additionalprimaryweapon_indicator_hud.hidewheninmenu = 1;
additionalprimaryweapon_indicator_hud setShader("specialty_additionalprimaryweapon_zombies", 24, 24);
while (1)
{
self waittill_any("weapon_change", "specialty_additionalprimaryweapon_stop");
if (!self hasPerk("specialty_additionalprimaryweapon"))
{
additionalprimaryweapon_indicator_hud fadeOverTime(0.5);
additionalprimaryweapon_indicator_hud.alpha = 0;
continue;
}
if (isDefined(self.a_saved_weapon) && self getCurrentWeapon() == self.a_saved_weapon["name"])
{
additionalprimaryweapon_indicator_hud fadeOverTime(0.5);
additionalprimaryweapon_indicator_hud.alpha = 1;
}
else
{
additionalprimaryweapon_indicator_hud fadeOverTime(0.5);
additionalprimaryweapon_indicator_hud.alpha = 0;
}
}
}
whos_who_spawn_changes()
{
self endon( "disconnect" );
while (1)
{
self waittill("fake_revive");
self.pers_upgrades_awarded["revive"] = 1;
self takeweapon("frag_grenade_zm");
self takeweapon("claymore_zm");
self giveweapon("sticky_grenade_zm");
self setweaponammoclip("sticky_grenade_zm", 2);
foreach (perk in self.loadout.perks)
{
self maps/mp/zombies/_zm_perks::give_perk(perk);
}
self waittill("chugabud_effects_cleanup");
self.pers_upgrades_awarded["revive"] = 0;
}
}
electric_cherry_unlimited()
{
self endon( "disconnect" );
for ( ;; )
{
self.consecutive_electric_cherry_attacks = 0;
wait 0.5;
}
}
zombie_health_fix()
{
for ( ;; )
{
level waittill( "start_of_round" );
wait 0.05;
if(level.zombie_health > 1000000)
{
level.zombie_health = 1000000;
}
}
}
show_powerswitch()
{
getent( "powerswitch_p6_zm_buildable_pswitch_hand", "targetname" ) show();
getent( "powerswitch_p6_zm_buildable_pswitch_body", "targetname" ) show();
getent( "powerswitch_p6_zm_buildable_pswitch_lever", "targetname" ) show();
}
zone_changes()
{
if(is_classic())
{
if(level.scr_zm_map_start_location == "rooftop")
{
// AN94 to Debris
level.zones[ "zone_orange_level3a" ].adjacent_zones[ "zone_orange_level3b" ].is_connected = 0;
// Trample Steam to Skyscraper
level.zones[ "zone_green_level3b" ].adjacent_zones[ "zone_blue_level1c" ] structdelete();
level.zones[ "zone_green_level3b" ].adjacent_zones[ "zone_blue_level1c" ] = undefined;
}
}
else
{
if(level.scr_zm_map_start_location == "farm")
{
// Barn to Farm
flag_set("OnFarm_enter");
}
}
}
screecher_remove_hint()
{
self.screecher_seen_hint = 1;
}
screecher_remove_near_miss()
{
level.near_miss = 2;
}
screecher_spawner_changes()
{
level.screecher_spawners = getentarray( "screecher_zombie_spawner", "script_noteworthy" );
array_thread( level.screecher_spawners, ::add_spawn_function, ::screecher_prespawn_decrease_health );
}
screecher_prespawn_decrease_health()
{
self.player_score = 12;
}
transit_power_local_electric_doors_globally()
{
if( !(is_classic() && level.scr_zm_map_start_location == "transit") )
{
return;
}
local_power = [];
for ( ;; )
{
flag_wait( "power_on" );
zombie_doors = getentarray( "zombie_door", "targetname" );
for ( i = 0; i < zombie_doors.size; i++ )
{
if ( isDefined( zombie_doors[i].script_noteworthy ) && zombie_doors[i].script_noteworthy == "local_electric_door" )
{
local_power[local_power.size] = maps/mp/zombies/_zm_power::add_local_power( zombie_doors[i].origin, 16 );
}
}
flag_waitopen( "power_on" );
for (i = 0; i < local_power.size; i++)
{
maps/mp/zombies/_zm_power::end_local_power( local_power[i] );
local_power[i] = undefined;
}
local_power = [];
}
}
transit_add_tombstone_machine_solo()
{
if (!(is_classic() && level.scr_zm_map_start_location == "transit"))
{
return;
}
if (!flag("solo_game"))
{
return;
}
perk_struct = undefined;
structs = getstructarray("zm_perk_machine", "targetname");
foreach (struct in structs)
{
if (IsDefined(struct.script_noteworthy) && IsDefined(struct.script_string))
{
if (struct.script_noteworthy == "specialty_scavenger" && IsSubStr(struct.script_string, "zclassic"))
{
perk_struct = struct;
break;
}
}
}
if(!IsDefined(perk_struct))
{
return;
}
// spawn new machine
use_trigger = spawn( "trigger_radius_use", perk_struct.origin + vectorScale( ( 0, 0, 1 ), 30 ), 0, 40, 70 );
use_trigger.targetname = "zombie_vending";
use_trigger.script_noteworthy = perk_struct.script_noteworthy;
use_trigger triggerignoreteam();
perk_machine = spawn( "script_model", perk_struct.origin );
perk_machine.angles = perk_struct.angles;
perk_machine setmodel( perk_struct.model );
bump_trigger = spawn( "trigger_radius", perk_struct.origin + AnglesToRight(perk_struct.angles) * 32, 0, 35, 32 );
bump_trigger.script_activated = 1;
bump_trigger.script_sound = "zmb_perks_bump_bottle";
bump_trigger.targetname = "audio_bump_trigger";
bump_trigger thread maps/mp/zombies/_zm_perks::thread_bump_trigger();
collision = spawn( "script_model", perk_struct.origin, 1 );
collision.angles = perk_struct.angles;
collision setmodel( "zm_collision_perks1" );
collision.script_noteworthy = "clip";
collision disconnectpaths();
use_trigger.clip = collision;
use_trigger.machine = perk_machine;
use_trigger.bump = bump_trigger;
if ( isDefined( perk_struct.blocker_model ) )
{
use_trigger.blocker_model = perk_struct.blocker_model;
}
if ( isDefined( perk_struct.script_int ) )
{
perk_machine.script_int = perk_struct.script_int;
}
if ( isDefined( perk_struct.turn_on_notify ) )
{
perk_machine.turn_on_notify = perk_struct.turn_on_notify;
}
use_trigger.script_sound = "mus_perks_tombstone_jingle";
use_trigger.script_string = "tombstone_perk";
use_trigger.script_label = "mus_perks_tombstone_sting";
use_trigger.target = "vending_tombstone";
perk_machine.script_string = "tombstone_perk";
perk_machine.targetname = "vending_tombstone";
bump_trigger.script_string = "tombstone_perk";
level thread maps/mp/zombies/_zm_perks::turn_tombstone_on();
use_trigger thread maps/mp/zombies/_zm_perks::vending_trigger_think();
use_trigger thread maps/mp/zombies/_zm_perks::electric_perks_dialog();
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( use_trigger.script_noteworthy );
maps/mp/zombies/_zm_power::add_powered_item( maps/mp/zombies/_zm_power::perk_power_on, ::perk_power_off, maps/mp/zombies/_zm_power::perk_range, maps/mp/zombies/_zm_power::cost_low_if_local, 0, powered_on, use_trigger );
}
transit_b23r_hint_string_fix()
{
flag_wait( "initial_blackscreen_passed" );
wait 0.05;
trigs = getentarray("weapon_upgrade", "targetname");
foreach (trig in trigs)
{
if (trig.zombie_weapon_upgrade == "beretta93r_zm")
{
hint = maps/mp/zombies/_zm_weapons::get_weapon_hint(trig.zombie_weapon_upgrade);
cost = level.zombie_weapons[trig.zombie_weapon_upgrade].cost;
trig sethintstring(hint, cost);
}
}
}
depot_remove_lava_collision()
{
if(!(!is_classic() && level.scr_zm_map_start_location == "transit"))
{
return;
}
ents = getEntArray( "script_model", "classname");
foreach (ent in ents)
{
if (IsDefined(ent.model))
{
if (ent.model == "zm_collision_transit_busdepot_survival")
{
ent delete();
}
else if (ent.model == "veh_t6_civ_smallwagon_dead" && ent.origin[0] == -6663.96 && ent.origin[1] == 4816.34)
{
ent delete();
}
else if (ent.model == "veh_t6_civ_microbus_dead" && ent.origin[0] == -6807.05 && ent.origin[1] == 4765.23)
{
ent delete();
}
else if (ent.model == "veh_t6_civ_movingtrk_cab_dead" && ent.origin[0] == -6652.9 && ent.origin[1] == 4767.7)
{
ent delete();
}
else if (ent.model == "p6_zm_rocks_small_cluster_01")
{
ent delete();
}
}
}
// spawn in new map edge collisions
// the lava collision and the map edge collisions are all the same entity
collision1 = spawn( "script_model", ( -5898, 4653, 0 ) );
collision1.angles = (0, 55, 0);
collision1 setmodel( "collision_wall_512x512x10_standard" );
collision2 = spawn( "script_model", ( -8062, 4700, 0 ) );
collision2.angles = (0, 70, 0);
collision2 setmodel( "collision_wall_512x512x10_standard" );
collision3 = spawn( "script_model", ( -7881, 5200, 0 ) );
collision3.angles = (0, 70, 0);
collision3 setmodel( "collision_wall_512x512x10_standard" );
}
depot_grief_close_local_electric_doors()
{
if(!(level.scr_zm_ui_gametype == "zgrief" && level.scr_zm_map_start_location == "transit"))
{
return;
}
zombie_doors = getentarray( "zombie_door", "targetname" );
foreach (door in zombie_doors)
{
if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" )
{
door delete();
}
}
}
depot_grief_link_nodes()
{
if(!(level.scr_zm_ui_gametype == "zgrief" && level.scr_zm_map_start_location == "transit"))
{
return;
}
flag_wait( "initial_blackscreen_passed" );
wait 0.05;
nodes = getnodearray( "classic_only_traversal", "targetname" );
foreach (node in nodes)
{
link_nodes( node, getnode( node.target, "targetname" ) );
}
}
town_move_tombstone_machine()
{
if (!(level.scr_zm_ui_gametype == "zstandard" && level.scr_zm_map_start_location == "town"))
{
return;
}
perk_struct = undefined;
structs = getstructarray("zm_perk_machine", "targetname");
foreach (struct in structs)
{
if (IsDefined(struct.script_noteworthy) && IsDefined(struct.script_string))
{
if (struct.script_noteworthy == "specialty_scavenger" && IsSubStr(struct.script_string, "zstandard"))
{
perk_struct = struct;
break;
}
}
}
if(!IsDefined(perk_struct))
{
return;
}
// delete old machine
vending_triggers = getentarray( "zombie_vending", "targetname" );
for (i = 0; i < vending_trigger.size; i++)
{
trig = vending_triggers[i];
if (IsDefined(trig.script_noteworthy) && trig.script_noteworthy == "specialty_scavenger")
{
trig.clip delete();
trig.machine delete();
trig.bump delete();
trig delete();
break;
}
}
// spawn new machine
origin = (1852, -825, -56);
angles = (0, 180, 0);
use_trigger = spawn( "trigger_radius_use", origin + vectorScale( ( 0, 0, 1 ), 30 ), 0, 40, 70 );
use_trigger.targetname = "zombie_vending";
use_trigger triggerignoreteam();
perk_machine = spawn( "script_model", origin );
perk_machine.angles = angles;
perk_machine setmodel( perk_struct.model );
bump_trigger = spawn( "trigger_radius", origin + AnglesToRight(angles) * 32, 0, 35, 32 );
bump_trigger.script_activated = 1;
bump_trigger.script_sound = "zmb_perks_bump_bottle";
bump_trigger.targetname = "audio_bump_trigger";
bump_trigger thread maps/mp/zombies/_zm_perks::thread_bump_trigger();
collision = spawn( "script_model", origin, 1 );
collision.angles = angles;
collision setmodel( "zm_collision_perks1" );
collision.script_noteworthy = "clip";
collision disconnectpaths();
use_trigger.clip = collision;
use_trigger.machine = perk_machine;
use_trigger.bump = bump_trigger;
if ( isDefined( perk_struct.blocker_model ) )
{
use_trigger.blocker_model = perk_struct.blocker_model;
}
if ( isDefined( perk_struct.script_int ) )
{
perk_machine.script_int = perk_struct.script_int;
}
if ( isDefined( perk_struct.turn_on_notify ) )
{
perk_machine.turn_on_notify = perk_struct.turn_on_notify;
}
use_trigger.script_sound = "mus_perks_tombstone_jingle";
use_trigger.script_string = "tombstone_perk";
use_trigger.script_label = "mus_perks_tombstone_sting";
use_trigger.target = "vending_tombstone";
perk_machine.script_string = "tombstone_perk";
perk_machine.targetname = "vending_tombstone";
bump_trigger.script_string = "tombstone_perk";
// wait until inital machine is removed
flag_wait( "initial_blackscreen_passed" );
wait 0.05;
// wait until after to set script_noteworthy so new machine isn't removed
use_trigger.script_noteworthy = perk_struct.script_noteworthy;
level thread maps/mp/zombies/_zm_perks::turn_tombstone_on();
use_trigger thread maps/mp/zombies/_zm_perks::vending_trigger_think();
use_trigger thread maps/mp/zombies/_zm_perks::electric_perks_dialog();
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( use_trigger.script_noteworthy );
maps/mp/zombies/_zm_power::add_powered_item( maps/mp/zombies/_zm_power::perk_power_on, ::perk_power_off, maps/mp/zombies/_zm_power::perk_range, maps/mp/zombies/_zm_power::cost_low_if_local, 0, powered_on, use_trigger );
}
town_move_staminup_machine()
{
if (!(!is_classic() && level.scr_zm_map_start_location == "town"))
{
return;
}
perk_struct = undefined;
structs = getstructarray("zm_perk_machine", "targetname");
foreach (struct in structs)
{
if (IsDefined(struct.script_noteworthy) && IsDefined(struct.script_string))
{
if (struct.script_noteworthy == "specialty_longersprint" && IsSubStr(struct.script_string, "zclassic"))
{
perk_struct = struct;
break;
}
}
}
if(!IsDefined(perk_struct))
{
return;
}
// delete old machine
vending_triggers = getentarray( "zombie_vending", "targetname" );
for (i = 0; i < vending_trigger.size; i++)
{
trig = vending_triggers[i];
if (IsDefined(trig.script_noteworthy) && trig.script_noteworthy == "specialty_longersprint")
{
trig.clip delete();
trig.machine delete();
trig.bump delete();
trig delete();
break;
}
}
// spawn new machine
use_trigger = spawn( "trigger_radius_use", perk_struct.origin + vectorScale( ( 0, 0, 1 ), 30 ), 0, 40, 70 );
use_trigger.targetname = "zombie_vending";
use_trigger.script_noteworthy = perk_struct.script_noteworthy;
use_trigger triggerignoreteam();
perk_machine = spawn( "script_model", perk_struct.origin );
perk_machine.angles = perk_struct.angles;
perk_machine setmodel( perk_struct.model );
bump_trigger = spawn( "trigger_radius", perk_struct.origin + AnglesToRight(perk_struct.angles) * 32, 0, 35, 32 );
bump_trigger.script_activated = 1;
bump_trigger.script_sound = "zmb_perks_bump_bottle";
bump_trigger.targetname = "audio_bump_trigger";
bump_trigger thread maps/mp/zombies/_zm_perks::thread_bump_trigger();
collision = spawn( "script_model", perk_struct.origin, 1 );
collision.angles = perk_struct.angles;
collision setmodel( "zm_collision_perks1" );
collision.script_noteworthy = "clip";
collision disconnectpaths();
use_trigger.clip = collision;
use_trigger.machine = perk_machine;
use_trigger.bump = bump_trigger;
if ( isDefined( perk_struct.blocker_model ) )
{
use_trigger.blocker_model = perk_struct.blocker_model;
}
if ( isDefined( perk_struct.script_int ) )
{
perk_machine.script_int = perk_struct.script_int;
}
if ( isDefined( perk_struct.turn_on_notify ) )
{
perk_machine.turn_on_notify = perk_struct.turn_on_notify;
}
use_trigger.script_sound = "mus_perks_stamin_jingle";
use_trigger.script_string = "marathon_perk";
use_trigger.script_label = "mus_perks_stamin_sting";
use_trigger.target = "vending_marathon";
perk_machine.script_string = "marathon_perk";
perk_machine.targetname = "vending_marathon";
bump_trigger.script_string = "marathon_perk";
level thread maps/mp/zombies/_zm_perks::turn_marathon_on();
use_trigger thread maps/mp/zombies/_zm_perks::vending_trigger_think();
use_trigger thread maps/mp/zombies/_zm_perks::electric_perks_dialog();
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( use_trigger.script_noteworthy );
maps/mp/zombies/_zm_power::add_powered_item( maps/mp/zombies/_zm_power::perk_power_on, ::perk_power_off, maps/mp/zombies/_zm_power::perk_range, maps/mp/zombies/_zm_power::cost_low_if_local, 0, powered_on, use_trigger );
}
prison_auto_refuel_plane()
{
if(!(is_classic() && level.scr_zm_map_start_location == "prison"))
{
return;
}
for ( ;; )
{
flag_wait( "spawn_fuel_tanks" );
wait 0.05;
buildcraftable( "refuelable_plane" );
}
}
prison_tower_trap_changes()
{
if(!(is_classic() && level.scr_zm_map_start_location == "prison"))
{
return;
}
// need to override the original function call
// this level var is threaded though so it doesn't work
level.custom_tower_trap_fires_func = ::prison_tower_trap_fires_override;
trap_trigs = getentarray( "tower_trap_activate_trigger", "targetname" );
foreach (trig in trap_trigs)
{
trig thread prison_tower_trap_trigger_think();
trig thread prison_tower_upgrade_trigger_think();
}
}
prison_tower_trap_fires_override( zombies )
{
}
prison_tower_trap_trigger_think()
{
while (1)
{
self waittill("switch_activated");
self thread prison_activate_tower_trap();
}
}
prison_activate_tower_trap()
{
self endon( "tower_trap_off" );
if ( isDefined( self.upgraded ) )
{
self.weapon_name = "tower_trap_upgraded_zm";
self.tag_to_target = "J_SpineLower";
self.trap_reload_time = 1.5;
}
else
{
self.weapon_name = "tower_trap_zm";
self.tag_to_target = "J_Head";
self.trap_reload_time = 0.75;
}
while ( 1 )
{
zombies = getaiarray( level.zombie_team );
zombies_sorted = [];
foreach ( zombie in zombies )
{
if ( zombie istouching( self.range_trigger ) )
{
zombies_sorted[ zombies_sorted.size ] = zombie;
}
}
if ( zombies_sorted.size <= 0 )
{
wait_network_frame();
continue;
}
self prison_tower_trap_fires( zombies_sorted );
}
}
prison_tower_trap_fires( zombies )
{
self endon( "tower_trap_off" );
org = getstruct( self.range_trigger.target, "targetname" );
index = randomintrange( 0, zombies.size );
while ( isalive( zombies[ index ] ) )
{
target = zombies[ index ];
zombietarget = target gettagorigin( self.tag_to_target );
if ( sighttracepassed( org.origin, zombietarget, 1, undefined ) )
{
self thread prison_tower_trap_magicbullet_think( org, target, zombietarget );
wait self.trap_reload_time;
continue;
}
else
{
arrayremovevalue( zombies, target, 0 );
wait_network_frame();
if ( zombies.size <= 0 )
{
return;
}
else
{
index = randomintrange( 0, zombies.size );
}
}
}
}
prison_tower_trap_magicbullet_think( org, target, zombietarget )
{
bullet = magicbullet( self.weapon_name, org.origin, zombietarget );
bullet waittill( "death" );
if ( self.weapon_name == "tower_trap_zm" )
{
if ( isDefined( target ) && isDefined( target.animname ) && target.health > 0 && target.animname != "brutus_zombie" )
{
if ( !isDefined( target.no_gib ) || !target.no_gib )
{
target maps/mp/zombies/_zm_spawner::zombie_head_gib();
}
target dodamage( target.health + 1000, target.origin );
}
}
else if ( self.weapon_name == "tower_trap_upgraded_zm" )
{
radiusdamage( bullet.origin, 256, level.zombie_health * 1.5, level.zombie_health / 2, self, "MOD_GRENADE_SPLASH", "tower_trap_upgraded_zm" );
}
}
prison_tower_upgrade_trigger_think()
{
flag_wait( "initial_blackscreen_passed" );
flag_wait( "start_zombie_round_logic" );
wait 0.05;
while (1)
{
level waittill( self.upgrade_trigger.script_string );
self.upgraded = 1;
level waittill( "between_round_over" );
self.upgraded = undefined;
}
}
buried_turn_power_on()
{
if(!(is_classic() && level.scr_zm_map_start_location == "processing"))
{
return;
}
trigger = getent( "use_elec_switch", "targetname" );
if ( isDefined( trigger ) )
{
trigger delete();
}
master_switch = getent( "elec_switch", "targetname" );
if ( isDefined( master_switch ) )
{
master_switch notsolid();
master_switch rotateroll( -90, 0.3 );
clientnotify( "power_on" );
flag_set( "power_on" );
}
}
buried_deleteslothbarricades()
{
if(!(is_classic() && level.scr_zm_map_start_location == "processing"))
{
return;
}
sloth_trigs = getentarray( "sloth_barricade", "targetname" );
foreach (trig in sloth_trigs)
{
if ( isDefined( trig.script_flag ) && level flag_exists( trig.script_flag ) )
{
flag_set( trig.script_flag );
}
parts = getentarray( trig.target, "targetname" );
array_thread( parts, ::self_delete );
}
array_thread( sloth_trigs, ::self_delete );
}
buried_enable_fountain_transport()
{
if(!(is_classic() && level.scr_zm_map_start_location == "processing"))
{
return;
}
flag_wait( "initial_blackscreen_passed" );
wait 1;
level notify( "courtyard_fountain_open" );
}
buried_disable_ghost_free_perk_on_damage()
{
if(!(is_classic() && level.scr_zm_map_start_location == "processing"))
{
return;
}
while (1)
{
buried_disable_ghost_free_perk();
}
}
buried_disable_ghost_free_perk()
{
level endon( "ghost_round_end" );
flag_wait( "spawn_ghosts" );
level waittill_any("ghost_drained_player", "ghost_damaged_player");
while (!isDefined(level.ghost_round_last_ghost_origin))
{
wait 0.05;
}
level.ghost_round_last_ghost_origin = undefined;
flag_waitopen( "spawn_ghosts" );
}
vulture_disable_stink_while_standing()
{
self endon( "disconnect" );
if(!(is_classic() && level.scr_zm_map_start_location == "processing"))
{
return;
}
while(!isDefined(self.perk_vulture))
{
wait 0.05;
}
while(1)
{
if (!self.perk_vulture.active)
{
wait 0.05;
continue;
}
self.perk_vulture.is_in_zombie_stink = 1;
self.perk_vulture.stink_time_entered = undefined;
b_player_in_zombie_stink = 0;
a_close_points = arraysort( level.perk_vulture.zombie_stink_array, self.origin, 1, 300 );
if ( a_close_points.size > 0 )
{
b_player_in_zombie_stink = self _is_player_in_zombie_stink( a_close_points );
}
if (b_player_in_zombie_stink)
{
vel = self GetVelocity();
magnitude = sqrt((vel[0] * vel[0]) + (vel[1] * vel[1]) + (vel[2] * vel[2]));
if (magnitude < 125)
{
self.perk_vulture.is_in_zombie_stink = 0;
wait 0.25;
while (self.vulture_stink_value > 0)
{
wait 0.05;
}
}
}
wait 0.05;
}
}
_is_player_in_zombie_stink( a_points )
{
b_is_in_stink = 0;
i = 0;
while ( i < a_points.size )
{
if ( distancesquared( a_points[ i ].origin, self.origin ) < 4900 )
{
b_is_in_stink = 1;
}
i++;
}
return b_is_in_stink;
}
borough_move_quickrevive_machine()
{
if (!(!is_classic() && level.scr_zm_map_start_location == "street"))
{
return;
}
perk_struct = undefined;
structs = getstructarray("zm_perk_machine", "targetname");
foreach (struct in structs)
{
if (IsDefined(struct.script_noteworthy) && IsDefined(struct.script_string))
{
if (struct.script_noteworthy == "specialty_quickrevive" && IsSubStr(struct.script_string, "zclassic"))
{
perk_struct = struct;
break;
}
}
}
if(!IsDefined(perk_struct))
{
return;
}
// delete old machine
vending_triggers = getentarray( "zombie_vending", "targetname" );
for (i = 0; i < vending_trigger.size; i++)
{
trig = vending_triggers[i];
if (IsDefined(trig.script_noteworthy) && trig.script_noteworthy == "specialty_quickrevive")
{
trig.clip delete();
trig.machine delete();
trig.bump delete();
trig delete();
break;
}
}
// spawn new machine
use_trigger = spawn( "trigger_radius_use", perk_struct.origin + vectorScale( ( 0, 0, 1 ), 30 ), 0, 40, 70 );
use_trigger.targetname = "zombie_vending";
use_trigger.script_noteworthy = perk_struct.script_noteworthy;
use_trigger triggerignoreteam();
perk_machine = spawn( "script_model", perk_struct.origin );
perk_machine.angles = perk_struct.angles;
perk_machine setmodel( perk_struct.model );
bump_trigger = spawn( "trigger_radius", perk_struct.origin + AnglesToRight(perk_struct.angles) * 32, 0, 35, 32 );
bump_trigger.script_activated = 1;
bump_trigger.script_sound = "zmb_perks_bump_bottle";
bump_trigger.targetname = "audio_bump_trigger";
bump_trigger thread maps/mp/zombies/_zm_perks::thread_bump_trigger();
collision = spawn( "script_model", perk_struct.origin, 1 );
collision.angles = perk_struct.angles;
collision setmodel( "zm_collision_perks1" );
collision.script_noteworthy = "clip";
collision disconnectpaths();
use_trigger.clip = collision;
use_trigger.machine = perk_machine;
use_trigger.bump = bump_trigger;
if ( isDefined( perk_struct.blocker_model ) )
{
use_trigger.blocker_model = perk_struct.blocker_model;
}
if ( isDefined( perk_struct.script_int ) )
{
perk_machine.script_int = perk_struct.script_int;
}
if ( isDefined( perk_struct.turn_on_notify ) )
{
perk_machine.turn_on_notify = perk_struct.turn_on_notify;
}
use_trigger.script_sound = "mus_perks_revive_jingle";
use_trigger.script_string = "revive_perk";
use_trigger.script_label = "mus_perks_revive_sting";
use_trigger.target = "vending_revive";
perk_machine.script_string = "revive_perk";
perk_machine.targetname = "vending_revive";
bump_trigger.script_string = "revive_perk";
level thread maps/mp/zombies/_zm_perks::turn_revive_on();
use_trigger thread maps/mp/zombies/_zm_perks::vending_trigger_think();
use_trigger thread maps/mp/zombies/_zm_perks::electric_perks_dialog();
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( use_trigger.script_noteworthy );
maps/mp/zombies/_zm_power::add_powered_item( maps/mp/zombies/_zm_power::perk_power_on, ::perk_power_off, maps/mp/zombies/_zm_power::perk_range, maps/mp/zombies/_zm_power::cost_low_if_local, 0, powered_on, use_trigger );
}
borough_move_speedcola_machine()
{
if (!(!is_classic() && level.scr_zm_map_start_location == "street"))
{
return;
}
perk_struct = undefined;
structs = getstructarray("zm_perk_machine", "targetname");
foreach (struct in structs)
{
if (IsDefined(struct.script_noteworthy) && IsDefined(struct.script_string))
{
if (struct.script_noteworthy == "specialty_fastreload" && IsSubStr(struct.script_string, "zclassic"))
{
perk_struct = struct;
break;
}
}
}
if(!IsDefined(perk_struct))
{
return;
}
// delete old machine
vending_triggers = getentarray( "zombie_vending", "targetname" );
for (i = 0; i < vending_trigger.size; i++)
{
trig = vending_triggers[i];
if (IsDefined(trig.script_noteworthy) && trig.script_noteworthy == "specialty_fastreload")
{
trig.clip delete();
trig.machine delete();
trig.bump delete();
trig delete();
break;
}
}
// spawn new machine
use_trigger = spawn( "trigger_radius_use", perk_struct.origin + vectorScale( ( 0, 0, 1 ), 30 ), 0, 40, 70 );
use_trigger.targetname = "zombie_vending";
use_trigger.script_noteworthy = perk_struct.script_noteworthy;
use_trigger triggerignoreteam();
perk_machine = spawn( "script_model", perk_struct.origin );
perk_machine.angles = perk_struct.angles;
perk_machine setmodel( perk_struct.model );
bump_trigger = spawn( "trigger_radius", perk_struct.origin + AnglesToRight(perk_struct.angles) * 32, 0, 35, 32 );
bump_trigger.script_activated = 1;
bump_trigger.script_sound = "zmb_perks_bump_bottle";
bump_trigger.targetname = "audio_bump_trigger";
bump_trigger thread maps/mp/zombies/_zm_perks::thread_bump_trigger();
collision = spawn( "script_model", perk_struct.origin, 1 );
collision.angles = perk_struct.angles;
collision setmodel( "zm_collision_perks1" );
collision.script_noteworthy = "clip";
collision disconnectpaths();
use_trigger.clip = collision;
use_trigger.machine = perk_machine;
use_trigger.bump = bump_trigger;
if ( isDefined( perk_struct.blocker_model ) )
{
use_trigger.blocker_model = perk_struct.blocker_model;
}
if ( isDefined( perk_struct.script_int ) )
{
perk_machine.script_int = perk_struct.script_int;
}
if ( isDefined( perk_struct.turn_on_notify ) )
{
perk_machine.turn_on_notify = perk_struct.turn_on_notify;
}
use_trigger.script_sound = "mus_perks_speed_jingle";
use_trigger.script_string = "speedcola_perk";
use_trigger.script_label = "mus_perks_speed_sting";
use_trigger.target = "vending_sleight";
perk_machine.script_string = "speedcola_perk";
perk_machine.targetname = "vending_sleight";
bump_trigger.script_string = "speedcola_perk";
level thread maps/mp/zombies/_zm_perks::turn_sleight_on();
use_trigger thread maps/mp/zombies/_zm_perks::vending_trigger_think();
use_trigger thread maps/mp/zombies/_zm_perks::electric_perks_dialog();
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( use_trigger.script_noteworthy );
maps/mp/zombies/_zm_power::add_powered_item( maps/mp/zombies/_zm_power::perk_power_on, ::perk_power_off, maps/mp/zombies/_zm_power::perk_range, maps/mp/zombies/_zm_power::cost_low_if_local, 0, powered_on, use_trigger );
}
borough_move_staminup_machine()
{
if (!(!is_classic() && level.scr_zm_map_start_location == "street"))
{
return;
}
perk_struct = undefined;
perk_location_struct = undefined;
structs = getstructarray("zm_perk_machine", "targetname");
foreach (struct in structs)
{
if (IsDefined(struct.script_noteworthy) && IsDefined(struct.script_string))
{
if (struct.script_noteworthy == "specialty_longersprint" && IsSubStr(struct.script_string, "zclassic"))
{
perk_struct = struct;
}
else if (struct.script_noteworthy == "specialty_quickrevive" && IsSubStr(struct.script_string, "zgrief"))
{
perk_location_struct = struct;
}
}
}
if(!IsDefined(perk_struct) || !IsDefined(perk_location_struct))
{
return;
}
// delete old machine
vending_triggers = getentarray( "zombie_vending", "targetname" );
for (i = 0; i < vending_trigger.size; i++)
{
trig = vending_triggers[i];
if (IsDefined(trig.script_noteworthy) && trig.script_noteworthy == "specialty_longersprint")
{
trig.clip delete();
trig.machine delete();
trig.bump delete();
trig delete();
break;
}
}
// spawn new machine
use_trigger = spawn( "trigger_radius_use", perk_location_struct.origin + vectorScale( ( 0, 0, 1 ), 30 ), 0, 40, 70 );
use_trigger.targetname = "zombie_vending";
use_trigger.script_noteworthy = perk_struct.script_noteworthy;
use_trigger triggerignoreteam();
perk_machine = spawn( "script_model", perk_location_struct.origin );
perk_machine.angles = perk_location_struct.angles;
perk_machine setmodel( perk_struct.model );
bump_trigger = spawn( "trigger_radius", perk_location_struct.origin + AnglesToRight(perk_location_struct.angles) * 32, 0, 35, 32 );
bump_trigger.script_activated = 1;
bump_trigger.script_sound = "zmb_perks_bump_bottle";
bump_trigger.targetname = "audio_bump_trigger";
bump_trigger thread maps/mp/zombies/_zm_perks::thread_bump_trigger();
collision = spawn( "script_model", perk_location_struct.origin, 1 );
collision.angles = perk_location_struct.angles;
collision setmodel( "zm_collision_perks1" );
collision.script_noteworthy = "clip";
collision disconnectpaths();
use_trigger.clip = collision;
use_trigger.machine = perk_machine;
use_trigger.bump = bump_trigger;
if ( isDefined( perk_struct.blocker_model ) )
{
use_trigger.blocker_model = perk_struct.blocker_model;
}
if ( isDefined( perk_struct.script_int ) )
{
perk_machine.script_int = perk_struct.script_int;
}
if ( isDefined( perk_struct.turn_on_notify ) )
{
perk_machine.turn_on_notify = perk_struct.turn_on_notify;
}
use_trigger.script_sound = "mus_perks_stamin_jingle";
use_trigger.script_string = "marathon_perk";
use_trigger.script_label = "mus_perks_stamin_sting";
use_trigger.target = "vending_marathon";
perk_machine.script_string = "marathon_perk";
perk_machine.targetname = "vending_marathon";
bump_trigger.script_string = "marathon_perk";
level thread maps/mp/zombies/_zm_perks::turn_marathon_on();
use_trigger thread maps/mp/zombies/_zm_perks::vending_trigger_think();
use_trigger thread maps/mp/zombies/_zm_perks::electric_perks_dialog();
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( use_trigger.script_noteworthy );
maps/mp/zombies/_zm_power::add_powered_item( maps/mp/zombies/_zm_power::perk_power_on, ::perk_power_off, maps/mp/zombies/_zm_power::perk_range, maps/mp/zombies/_zm_power::cost_low_if_local, 0, powered_on, use_trigger );
}
tomb_increase_solo_door_prices()
{
if(!(is_classic() && level.scr_zm_map_start_location == "tomb"))
{
return;
}
flag_wait( "initial_blackscreen_passed" );
if ( isDefined( level.is_forever_solo_game ) && level.is_forever_solo_game )
{
a_door_buys = getentarray( "zombie_door", "targetname" );
array_thread( a_door_buys, ::door_price_increase_for_solo );
a_debris_buys = getentarray( "zombie_debris", "targetname" );
array_thread( a_debris_buys, ::door_price_increase_for_solo );
}
}
door_price_increase_for_solo()
{
self.zombie_cost += 250;
if ( self.targetname == "zombie_door" )
{
self set_hint_string( self, "default_buy_door", self.zombie_cost );
}
else
{
self set_hint_string( self, "default_buy_debris", self.zombie_cost );
}
}
tomb_remove_weighted_random_perks()
{
if(!(is_classic() && level.scr_zm_map_start_location == "tomb"))
{
return;
}
level.custom_random_perk_weights = undefined;
}
tomb_remove_shovels_from_map()
{
if(!(is_classic() && level.scr_zm_map_start_location == "tomb"))
{
return;
}
flag_wait( "initial_blackscreen_passed" );
stubs = level._unitriggers.trigger_stubs;
for(i = 0; i < stubs.size; i++)
{
stub = stubs[i];
if(IsDefined(stub.e_shovel))
{
stub.e_shovel delete();
maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( stub );
}
}
}
tomb_give_shovel()
{
if(!(is_classic() && level.scr_zm_map_start_location == "tomb"))
{
return;
}
self.dig_vars[ "has_shovel" ] = 1;
n_player = self getentitynumber() + 1;
level setclientfield( "shovel_player" + n_player, 1 );
}
tomb_challenges_changes()
{
if(!(is_classic() && level.scr_zm_map_start_location == "tomb"))
{
return;
}
level._challenges.a_stats["zc_points_spent"].fp_give_reward = ::tomb_reward_random_perk;
}
tomb_reward_random_perk( player, s_stat )
{
if (!isDefined(player.tomb_reward_perk))
{
player.tomb_reward_perk = player get_random_perk();
}
else if (isDefined( self.perk_purchased ) && self.perk_purchased == player.tomb_reward_perk)
{
player.tomb_reward_perk = player get_random_perk();
}
else if (self hasperk( player.tomb_reward_perk ) || self maps/mp/zombies/_zm_perks::has_perk_paused( player.tomb_reward_perk ))
{
player.tomb_reward_perk = player get_random_perk();
}
perk = player.tomb_reward_perk;
if (!isDefined(perk))
{
return 0;
}
model = get_perk_weapon_model(perk);
if (!isDefined(model))
{
return 0;
}
m_reward = spawn( "script_model", self.origin );
m_reward.angles = self.angles + vectorScale( ( 0, 1, 0 ), 180 );
m_reward setmodel( model );
m_reward playsound( "zmb_spawn_powerup" );
m_reward playloopsound( "zmb_spawn_powerup_loop", 0.5 );
wait_network_frame();
if ( !reward_rise_and_grab( m_reward, 50, 2, 2, 10 ) )
{
return 0;
}
if ( player hasperk( perk ) || player maps/mp/zombies/_zm_perks::has_perk_paused( perk ) )
{
m_reward thread bottle_reject_sink( player );
return 0;
}
m_reward stoploopsound( 0.1 );
player playsound( "zmb_powerup_grabbed" );
m_reward thread maps/mp/zombies/_zm_perks::vending_trigger_post_think( player, perk );
m_reward delete();
player increment_player_perk_purchase_limit();
player maps/mp/zombies/_zm_stats::increment_client_stat( "tomb_perk_extension", 0 );
player maps/mp/zombies/_zm_stats::increment_player_stat( "tomb_perk_extension" );
player thread player_perk_purchase_limit_fix();
return 1;
}
get_random_perk()
{
perks = [];
for (i = 0; i < level._random_perk_machine_perk_list.size; i++)
{
perk = level._random_perk_machine_perk_list[ i ];
if ( isDefined( self.perk_purchased ) && self.perk_purchased == perk )
{
continue;
}
else
{
if ( !self hasperk( perk ) && !self maps/mp/zombies/_zm_perks::has_perk_paused( perk ) )
{
perks[ perks.size ] = perk;
}
}
}
if ( perks.size > 0 )
{
perks = array_randomize( perks );
random_perk = perks[ 0 ];
return random_perk;
}
}
get_perk_weapon_model( perk )
{
switch( perk )
{
case "specialty_armorvest":
case "specialty_armorvest_upgrade":
weapon = level.machine_assets[ "juggernog" ].weapon;
break;
case "specialty_quickrevive":
case "specialty_quickrevive_upgrade":
weapon = level.machine_assets[ "revive" ].weapon;
break;
case "specialty_fastreload":
case "specialty_fastreload_upgrade":
weapon = level.machine_assets[ "speedcola" ].weapon;
break;
case "specialty_rof":
case "specialty_rof_upgrade":
weapon = level.machine_assets[ "doubletap" ].weapon;
break;
case "specialty_longersprint":
case "specialty_longersprint_upgrade":
weapon = level.machine_assets[ "marathon" ].weapon;
break;
case "specialty_flakjacket":
case "specialty_flakjacket_upgrade":
weapon = level.machine_assets[ "divetonuke" ].weapon;
break;
case "specialty_deadshot":
case "specialty_deadshot_upgrade":
weapon = level.machine_assets[ "deadshot" ].weapon;
break;
case "specialty_additionalprimaryweapon":
case "specialty_additionalprimaryweapon_upgrade":
weapon = level.machine_assets[ "additionalprimaryweapon" ].weapon;
break;
case "specialty_scavenger":
case "specialty_scavenger_upgrade":
weapon = level.machine_assets[ "tombstone" ].weapon;
break;
case "specialty_finalstand":
case "specialty_finalstand_upgrade":
weapon = level.machine_assets[ "whoswho" ].weapon;
break;
}
if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].perk_bottle ) )
{
weapon = level._custom_perks[ perk ].perk_bottle;
}
return getweaponmodel( weapon );
}
increment_player_perk_purchase_limit()
{
if ( !isDefined( self.player_perk_purchase_limit ) )
{
self.player_perk_purchase_limit = level.perk_purchase_limit;
}
self.player_perk_purchase_limit++;
}
player_perk_purchase_limit_fix()
{
self endon("disconnect");
while (self.pers[ "tomb_perk_extension" ] < 5)
{
wait .5;
}
if (self.player_perk_purchase_limit < 9)
{
self.player_perk_purchase_limit = 9;
}
}
reward_rise_and_grab( m_reward, n_z, n_rise_time, n_delay, n_timeout )
{
m_reward movez( n_z, n_rise_time );
wait n_rise_time;
if ( n_timeout > 0 )
{
m_reward thread reward_sink( n_delay, n_z, n_timeout + 1 );
}
self reward_grab_wait( n_timeout );
if ( self ent_flag( "reward_timeout" ) )
{
return 0;
}
return 1;
}
reward_sink( n_delay, n_z, n_time )
{
if ( isDefined( n_delay ) )
{
wait n_delay;
if ( isDefined( self ) )
{
self movez( n_z * -1, n_time );
}
}
}
reward_grab_wait( n_timeout )
{
if ( !isDefined( n_timeout ) )
{
n_timeout = 10;
}
self ent_flag_clear( "reward_timeout" );
self ent_flag_set( "waiting_for_grab" );
self endon( "waiting_for_grab" );
if ( n_timeout > 0 )
{
wait n_timeout;
self ent_flag_set( "reward_timeout" );
self ent_flag_clear( "waiting_for_grab" );
}
else
{
self ent_flag_waitopen( "waiting_for_grab" );
}
}
bottle_reject_sink( player )
{
n_time = 1;
player playlocalsound( level.zmb_laugh_alias );
self thread reward_sink( 0, 61, n_time );
wait n_time;
self delete();
}
tomb_zombie_blood_dig_changes()
{
if(!(is_classic() && level.scr_zm_map_start_location == "tomb"))
{
return;
}
while (1)
{
for (i = 0; i < level.a_zombie_blood_entities.size; i++)
{
ent = level.a_zombie_blood_entities[i];
if (IsDefined(ent.e_unique_player))
{
if (!isDefined(ent.e_unique_player.initial_zombie_blood_dig))
{
ent.e_unique_player.initial_zombie_blood_dig = 0;
}
ent.e_unique_player.initial_zombie_blood_dig++;
if (ent.e_unique_player.initial_zombie_blood_dig <= 2)
{
ent setvisibletoplayer(ent.e_unique_player);
}
else
{
ent thread set_visible_after_rounds(ent.e_unique_player, 3);
}
arrayremovevalue(level.a_zombie_blood_entities, ent);
}
}
wait .5;
}
}
set_visible_after_rounds(player, num)
{
for (i = 0; i < num; i++)
{
level waittill( "end_of_round" );
}
self setvisibletoplayer(player);
}
tomb_soul_box_changes()
{
if(!(is_classic() && level.scr_zm_map_start_location == "tomb"))
{
return;
}
a_boxes = getentarray( "foot_box", "script_noteworthy" );
array_thread( a_boxes, ::tomb_soul_box_decrease_kill_requirement );
}
tomb_soul_box_decrease_kill_requirement()
{
self endon( "box_finished" );
while (1)
{
self waittill( "soul_absorbed" );
wait 0.05;
self.n_souls_absorbed += 10;
self waittill( "robot_foot_stomp" );
}
}
test()
{
while(1)
{
wait 1;
}
}