#include maps/mp/zombies/_zm_audio; #include maps/mp/zombies/_zm_stats; #include maps/mp/zombies/_zm_blockers; #include maps/mp/zombies/_zm; #include maps/mp/zm_transit_distance_tracking; #include maps/mp/zm_transit; #include maps/mp/zm_transit_power; #include maps/mp/zm_transit_ai_screecher; #include maps/mp/zm_transit_bus; #include maps/mp/zm_transit_buildables; #include maps/mp/zm_transit_utility; #include maps/mp/zombies/_zm_buildables; #include maps/mp/zombies/_zm_weapons; #include maps/mp/zombies/_zm_utility; #include maps/mp/_utility; #include common_scripts/utility; precache() { maps/mp/zombies/_zm_ai_screecher::precache(); maps/mp/zombies/_zm_ai_avogadro::precache(); maps/mp/zm_transit_buildables::include_buildables(); maps/mp/zm_transit_buildables::init_buildables(); maps/mp/zm_transit_sq::init(); maps/mp/zombies/_zm_equip_turbine::init(); maps/mp/zombies/_zm_equip_turret::init(); maps/mp/zombies/_zm_equip_electrictrap::init(); precachemodel( "zm_collision_transit_town_classic" ); precachemodel( "p_glo_tools_chest_tall" ); precachemodel( "fxanim_zom_bus_interior_mod" ); precachemodel( "p6_anim_zm_barricade_board_collision" ); precachemodel( "p6_anim_zm_barricade_board_bus_collision" ); registerclientfield( "vehicle", "the_bus_spawned", 1, 1, "int" ); registerclientfield( "vehicle", "bus_flashing_lights", 1, 1, "int" ); registerclientfield( "vehicle", "bus_head_lights", 1, 1, "int" ); registerclientfield( "vehicle", "bus_brake_lights", 1, 1, "int" ); registerclientfield( "vehicle", "bus_turn_signal_left", 1, 1, "int" ); registerclientfield( "vehicle", "bus_turn_signal_right", 1, 1, "int" ); registerclientfield( "allplayers", "screecher_sq_lights", 1, 1, "int" ); registerclientfield( "allplayers", "screecher_maxis_lights", 1, 1, "int" ); registerclientfield( "allplayers", "sq_tower_sparks", 1, 1, "int" ); onplayerconnect_callback( ::maps/mp/zm_transit_bus::onplayerconnect ); onplayerconnect_callback( ::maps/mp/zm_transit_ai_screecher::portal_player_watcher ); level thread maps/mp/zombies/_zm_banking::init(); } main() { level.ta_vaultfee = 100; level.ta_tellerfee = 100; if ( !isDefined( level.custom_ai_type ) ) { level.custom_ai_type = []; } level.custom_ai_type[ level.custom_ai_type.size ] = ::maps/mp/zombies/_zm_ai_screecher::init; level.custom_ai_type[ level.custom_ai_type.size ] = ::maps/mp/zombies/_zm_ai_avogadro::init; level.enemy_location_override_func = ::maps/mp/zm_transit_bus::enemy_location_override; level.adjust_enemyoverride_func = ::maps/mp/zm_transit_bus::adjust_enemyoverride; level.closest_player_override = ::closest_player_transit; door_triggers = getentarray( "electric_door", "script_noteworthy" ); _a80 = door_triggers; _k80 = getFirstArrayKey( _a80 ); while ( isDefined( _k80 ) ) { trigger = _a80[ _k80 ]; if ( isDefined( trigger.script_flag ) && trigger.script_flag == "OnPowDoorWH" ) { } else { trigger.power_door_ignore_flag_wait = 1; } _k80 = getNextArrayKey( _a80, _k80 ); } door_triggers = getentarray( "local_electric_door", "script_noteworthy" ); _a91 = door_triggers; _k91 = getFirstArrayKey( _a91 ); while ( isDefined( _k91 ) ) { trigger = _a91[ _k91 ]; if ( isDefined( trigger.script_flag ) && trigger.script_flag == "OnPowDoorWH" ) { } else { trigger.power_door_ignore_flag_wait = 1; } _k91 = getNextArrayKey( _a91, _k91 ); } level.zm_traversal_override = ::zm_traversal_override; level.the_bus = getent( "the_bus", "targetname" ); level thread init_bus(); level thread maps/mp/zm_transit_sq::start_transit_sidequest(); level thread inert_zombies_init(); level thread maps/mp/zm_transit_power::initializepower(); level thread maps/mp/zm_transit_ambush::main(); level thread maps/mp/zm_transit::falling_death_init(); level.check_valid_spawn_override = ::maps/mp/zm_transit::transit_respawn_override; level.zombie_check_suppress_gibs = ::maps/mp/zm_transit_bus::shouldsuppressgibs; level thread transit_vault_breach_init(); level thread maps/mp/zm_transit_distance_tracking::zombie_tracking_init(); level thread solo_tombstone_removal(); level thread collapsing_bridge_init(); level thread banking_and_weapon_locker_main(); level thread bus_roof_damage_init(); level thread diner_hatch_access(); level thread maps/mp/zombies/_zm_buildables::think_buildables(); setdvar( "r_rimIntensity_debug", 1 ); setdvar( "r_rimIntensity", 3,5 ); level thread zm_traversal_override_ignores(); level thread maps/mp/zombies/_zm::post_main(); level.spectator_respawn_custom_score = ::callback_spectator_respawn_custom_score; level.custom_pap_deny_vo_func = ::transit_custom_deny_vox; level.custom_generic_deny_vo_func = ::transit_custom_deny_vox; level.custom_player_death_vo_func = ::transit_custom_death_vox; level.custom_powerup_vo_response = ::transit_custom_powerup_vo_response; level.zombie_vars[ "zombie_intermission_time" ] = 12; } zm_traversal_override_ignores() { } zm_traversal_override( traversealias ) { suffix = ""; sndalias = undefined; chance = 0; sndchance = 0; if ( isDefined( self.isscreecher ) && !self.isscreecher && isDefined( self.is_avogadro ) && !self.is_avogadro ) { if ( isDefined( self.traversestartnode ) && isDefined( self.traversestartnode.script_string ) && self.traversestartnode.script_string == "ignore_traverse_override" ) { return traversealias; } switch( traversealias ) { case "jump_down_48": if ( isDefined( self.has_legs ) && self.has_legs ) { suffix = "_stumble"; chance = 0; } break; case "jump_down_127": case "jump_down_190": case "jump_down_222": case "jump_down_90": if ( isDefined( self.has_legs ) && self.has_legs ) { suffix = "_stumble"; chance = 30; } break; case "jump_up_127": case "jump_up_190": case "jump_up_222": case "jump_up_48": sndalias = "vox_zmba_zombie_pickup_" + randomint( 2 ); suffix = "_grabbed"; chance = 6; sndchance = 3; break; } if ( chance != 0 && randomint( 100 ) <= chance ) { if ( isDefined( sndalias ) && randomint( 100 ) <= sndchance ) { playsoundatposition( sndalias, self.origin ); } traversealias += suffix; } } return traversealias; } init_bus() { flag_wait( "start_zombie_round_logic" ); level.the_bus thread maps/mp/zm_transit_bus::bussetup(); } closest_player_transit( origin, players ) { if ( isDefined( level.the_bus ) || level.the_bus.numaliveplayersridingbus > 0 && isDefined( level.calc_closest_player_using_paths ) && !level.calc_closest_player_using_paths ) { player = getclosest( origin, players ); } else { player = get_closest_player_using_paths( origin, players ); } return player; } transit_vault_breach_init() { vault_doors = getentarray( "town_bunker_door", "targetname" ); array_thread( vault_doors, ::transit_vault_breach ); } transit_vault_breach() { if ( isDefined( self ) ) { self.damage_state = 0; if ( isDefined( self.target ) ) { clip = getent( self.target, "targetname" ); clip linkto( self ); self.clip = clip; } self thread vault_breach_think(); } else { return; } } vault_breach_think() { level endon( "intermission" ); self.health = 99999; self setcandamage( 1 ); self.damage_state = 0; self.clip.health = 99999; self.clip setcandamage( 1 ); while ( 1 ) { self thread track_clip_damage(); self waittill( "damage", amount, attacker, direction, point, dmg_type, modelname, tagname, partname, weaponname ); if ( isDefined( weaponname ) && weaponname != "emp_grenade_zm" || weaponname == "ray_gun_zm" && weaponname == "ray_gun_upgraded_zm" ) { continue; } if ( isDefined( amount ) && amount <= 1 ) { continue; } if ( isplayer( attacker ) && dmg_type != "MOD_PROJECTILE" && dmg_type != "MOD_PROJECTILE_SPLASH" && dmg_type != "MOD_EXPLOSIVE" && dmg_type != "MOD_EXPLOSIVE_SPLASH" || dmg_type == "MOD_GRENADE" && dmg_type == "MOD_GRENADE_SPLASH" ) { if ( self.damage_state == 0 ) { self.damage_state = 1; } playfxontag( level._effect[ "def_explosion" ], self, "tag_origin" ); self playsound( "exp_vault_explode" ); self bunkerdoorrotate( 1 ); if ( isDefined( self.script_flag ) ) { flag_set( self.script_flag ); } if ( isDefined( self.clip ) ) { self.clip connectpaths(); } wait 1; playsoundatposition( "zmb_cha_ching_loud", self.origin ); return; } } } track_clip_damage() { self endon( "damage" ); self.clip waittill( "damage", amount, attacker, direction, point, dmg_type ); self notify( "damage" ); } bunkerdoorrotate( open, time ) { if ( !isDefined( time ) ) { time = 0,2; } rotate = self.script_float; if ( !open ) { rotate *= -1; } if ( isDefined( self.script_angles ) ) { self notsolid(); self rotateto( self.script_angles, time, 0, 0 ); self thread maps/mp/zombies/_zm_blockers::door_solid_thread(); } } collapsing_bridge_init() { time = 1,5; trig = getent( "bridge_trig", "targetname" ); if ( !isDefined( trig ) ) { return; } bridge = getentarray( trig.target, "targetname" ); if ( !isDefined( bridge ) ) { return; } trig waittill( "trigger", who ); trig playsound( "evt_bridge_collapse_start" ); trig thread play_delayed_sound( time ); i = 0; while ( i < bridge.size ) { if ( isDefined( bridge[ i ].script_angles ) ) { rot_angle = bridge[ i ].script_angles; } else { rot_angle = ( 0, 0, 0 ); } earthquake( randomfloatrange( 0,5, 1 ), 1,5, bridge[ i ].origin, 1000 ); exploder( 150 ); bridge[ i ] rotateto( rot_angle, time, 0, 0 ); i++; } wait 1; if ( !isDefined( level.collapse_vox_said ) ) { level thread automatonspeak( "inform", "bridge_collapse" ); level.collapse_vox_said = 1; } } play_delayed_sound( time ) { wait time; self playsound( "evt_bridge_collapse_end" ); } banking_and_weapon_locker_main() { flag_wait( "start_zombie_round_logic" ); weapon_locker = spawnstruct(); weapon_locker.origin = ( 8236, -6844, 144 ); weapon_locker.angles = vectorScale( ( 0, 0, 0 ), 30 ); weapon_locker.script_length = 16; weapon_locker.script_width = 32; weapon_locker.script_height = 64; deposit_spot = spawnstruct(); deposit_spot.origin = ( 588, 402, 6 ); deposit_spot.angles = ( 0, 0, 0 ); deposit_spot.targetname = "bank_deposit"; deposit_spot.script_unitrigger_type = "unitrigger_radius_use"; deposit_spot.radius = 32; withdraw_spot = spawnstruct(); withdraw_spot.origin = ( 588, 496, 6 ); withdraw_spot.angles = ( 0, 0, 0 ); withdraw_spot.targetname = "bank_withdraw"; withdraw_spot.script_unitrigger_type = "unitrigger_radius_use"; withdraw_spot.radius = 32; level thread maps/mp/zombies/_zm_weapon_locker::main(); weapon_locker thread maps/mp/zombies/_zm_weapon_locker::triggerweaponslockerwatch(); level thread maps/mp/zombies/_zm_banking::main(); deposit_spot thread maps/mp/zombies/_zm_banking::bank_deposit_unitrigger(); withdraw_spot thread maps/mp/zombies/_zm_banking::bank_withdraw_unitrigger(); } bus_roof_damage_init() { trigs = getentarray( "bus_knock_off", "targetname" ); array_thread( trigs, ::bus_roof_damage ); } bus_roof_damage() { while ( 1 ) { self waittill( "trigger", who ); if ( isplayer( who ) ) { if ( who getstance() == "stand" ) { who dodamage( 1, who.origin ); } } else { if ( isDefined( who.marked_for_death ) && !who.marked_for_death && isDefined( who.has_legs ) && who.has_legs ) { who dodamage( who.health + 100, who.origin ); who.marked_for_death = 1; level.zombie_total++; } } wait 0,1; } } diner_hatch_access() { diner_hatch = getent( "diner_hatch", "targetname" ); diner_hatch_col = getent( "diner_hatch_collision", "targetname" ); diner_hatch_mantle = getent( "diner_hatch_mantle", "targetname" ); if ( !isDefined( diner_hatch ) || !isDefined( diner_hatch_col ) ) { return; } diner_hatch hide(); diner_hatch_mantle.start_origin = diner_hatch_mantle.origin; diner_hatch_mantle.origin += vectorScale( ( 0, 0, 0 ), 500 ); player = wait_for_buildable( "dinerhatch" ); diner_hatch show(); diner_hatch_col delete(); diner_hatch_mantle.origin = diner_hatch_mantle.start_origin; player maps/mp/zombies/_zm_buildables::track_placed_buildables( "dinerhatch" ); } inert_zombies_init() { inert_spawn_location = getstructarray( "inert_location", "script_noteworthy" ); if ( isDefined( inert_spawn_location ) ) { array_thread( inert_spawn_location, ::spawn_inert_zombies ); } } spawn_inert_zombies() { if ( !isDefined( self.angles ) ) { self.angles = ( 0, 0, 0 ); } wait 0,1; if ( isDefined( level.zombie_spawners ) ) { spawner = random( level.zombie_spawners ); ai = spawn_zombie( spawner ); } if ( isDefined( ai ) ) { ai forceteleport( self.origin, self.angles ); ai.start_inert = 1; } } sparking_power_lines() { lines = getentarray( "power_line_sparking", "targetname" ); } callback_spectator_respawn_custom_score() { difference = 1500 - self.score; money_required = 1; if ( difference >= 1000 ) { money_required = 2; } if ( !sessionmodeisonlinegame() ) { if ( !isDefined( self.account_val ) ) { self.account_val = 0; } if ( self.account_val >= money_required ) { self.account_val -= money_required; } else { self.account_val = 0; } } else account_val = self maps/mp/zombies/_zm_stats::get_map_stat( "depositBox" ); if ( account_val >= money_required ) { self set_map_stat( "depositBox", account_val - money_required ); } else { self set_map_stat( "depositBox", 0 ); } } transit_custom_deny_vox( door_buy ) { switch( self.characterindex ) { case 0: alias = randomintrange( 2, 5 ); if ( isDefined( door_buy ) && door_buy ) { alias = undefined; } self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "door_deny", undefined, alias ); break; case 1: self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 ); break; case 2: self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 ); break; case 3: x = randomint( 100 ); if ( x > 66 ) { self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 ); } else if ( x > 33 ) { self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money_box", undefined, 0 ); } else { self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money_weapon", undefined, 0 ); } break; } } transit_custom_death_vox() { if ( self.characterindex != 2 ) { return 0; } self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "pain_high" ); return 1; } transit_custom_powerup_vo_response( powerup_player, powerup ) { dist = 250000; players = get_players(); _a660 = players; _k660 = getFirstArrayKey( _a660 ); while ( isDefined( _k660 ) ) { player = _a660[ _k660 ]; if ( player == powerup_player ) { } else if ( distancesquared( player.origin, powerup_player.origin ) < dist ) { player do_player_general_vox( "general", "exert_laugh", 10, 5 ); } _k660 = getNextArrayKey( _a660, _k660 ); } }