#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 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 ); } 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); 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; } }