#include maps\_anim; #include maps\_utility; #include common_scripts\utility; #include maps\_music; #include maps\_zombietron_utility; #include maps\_busing; save_restore_callback() { wait 0.75; move_players_to_start(); fade_in(); } init_client_flags() { level._ZT_ACTOR_CF_GIB_DEATH_P1 = 2; level._ZT_ACTOR_CF_GIB_DEATH_P2 = 3; level._ZT_ACTOR_CF_GIB_DEATH_P3 = 4; level._ZT_ACTOR_CF_GIB_DEATH_P4 = 5; level._ZT_ACTOR_CF_BLOOD = 6; level._ZT_ACTOR_CF_LAUNCH_AND_BURN = 7; level._ZT_ACTOR_CF_KILLED_BY_HELI = 8; level._ZT_SCRIPTMOVER_CF_SACRED_COW = 0; level._ZT_SCRIPTMOVER_CF_POWERUP = 1; level._ZT_SCRIPTMOVER_CF_ELEC_TRAP = 2; level._ZT_PLAYER_CF_UPDATEPROFILE = 10; level._ZT_PLAYER_CF_HELI_PILOT = 11; level._ZT_PLAYER_CF_LIGHTNING = 12; level._ZT_PLAYER_CF_SHOW_SCORES = 13; level._ZT_PLAYER_CF_START_SMART_BOMB = 14; } main() { level thread fade_out(.1); level.zombiemode = true; level.zombietron_mode = true; level.reviveFeature = false; level.contextualMeleeFeature = false; level.swimmingFeature = false; init_client_flags(); maps\_zombietron_load::main(); maps\_zombietron_spawner::init(); maps\_zombietron_pickups::init(); maps\_zombietron_weapon::main(); level thread maps\_zombietron_fate::main(); init_function_overrides(); DisableGrenadeSuicide(); level thread maps\zombietron::onPlayerConnect(); level thread post_all_players_connected(); level thread players_playing(); level thread init_difficulty(); level thread maps\_zombietron_ai_ape::ape_taunt_player(); level thread maps\_zombietron_ai_buffalo::buffalo_stampede_monitor(); level thread maps\_zombietron_challenges::barrel_challenge_monitor(); OnSaveRestored_Callback( ::save_restore_callback ); level.onMenuMessage = maps\zombietron::menu_message; level thread setup_ambient_fx(); level.startInvulnerableTime = GetDvarInt( #"player_deathInvulnerableTime" ); level thread detect_and_change_music_states(); if( isDefined( level.custom_ai_type ) ) { for( i = 0; i < level.custom_ai_type.size; i++ ) { [[ level.custom_ai_type[i] ]](); } } initZombieLeaderboardData(); if( IsSplitScreen() ) { halfway_height = 10000; cull_dist = 10000; set_splitscreen_fog( 350, 2986.33, halfway_height, -480, 0.805, 0.715, 0.61, 0.0, cull_dist ); } if (!isDefined(level.survived_msg)) { level.survived_msg = NewHudElem( level ); level.survived_msg.alignX = "center"; level.survived_msg.alignY = "middle"; level.survived_msg.horzAlign = "center"; level.survived_msg.vertAlign = "middle"; level.survived_msg.y += 20; level.survived_msg.foreground = true; level.survived_msg.fontScale = 2; level.survived_msg.color = ( 1.0, 0.0, 0.0 ); level.survived_msg.hidewheninmenu = true; if (isSplitScreen()) { level.survived_msg.y += 30; } } if (!isDefined(level.msg_t3)) { level.msg_t3 = NewHudElem( level ); level.msg_t3.alignX = "center"; level.msg_t3.alignY = "middle"; level.msg_t3.horzAlign = "center"; level.msg_t3.vertAlign = "middle"; level.msg_t3.y += 40; level.msg_t3.foreground = true; level.msg_t3.fontScale = 1.25; level.msg_t3.color = ( 1.0, 0.0, 0.0 ); level.msg_t3.hidewheninmenu = true; if (isSplitScreen()) { level.msg_t3.y += 30; } } } arena_findIndexByName(name) { for(i=0;i0) { zombies = GetAISpeciesArray( "axis", "all" ); level.zombie_count = zombies.size; wait 1; } } round_spawning() { level notify("round_spawning_starting"); level.round_start_time = GetTime(); level.round_end_time = undefined; if ( level.epic_boss_battle == true ) { flag_wait("boss_intro_done"); } if ( level.RandomMiniBosses.size > 0 ) { level thread mini_boss_spawn_think(); } spawn_set = level.arenas[level.current_arena] + "_spawner"; level.current_spawners = level.spawners[spawn_set]; assertex(isDefined(level.current_spawners),"No Spawenrs set up for zombietron environment."); flag_set("round_is_active"); level thread round_zombie_counter(8); for( wave = 0; wave < level.spawn_sequence.size; wave++ ) { if ( flag("all_players_dead") ) { break; } if ( flag("boss_is_spawned") ) { if ( flag("boss_is_dead") ) { break; } else { if ( wave == level.spawn_sequence.size - 1) { wave -= RandomIntRange(4,10); if ( wave < 0 ) wave = 0; } } } if ( isDefined(level.desiredRound) ) { break; } level.current_wave = level.spawn_sequence[wave]; thread wave_spawn( level.current_wave ); wait level.current_wave.time_till_next_group; } flag_clear("round_is_active"); level notify("round_spawning_done"); level.round_end_time = GetTime(); wait 1; zombies = GetAISpeciesArray( "axis", "all" ); array_thread(zombies,maps\_zombietron_spawner::zombie_killer_failsafe); } get_all_the_map_spawners_on_side(side) { spawners = []; for (i=0;i max ) { waves = max; } for( i = 0; i < waves; i++ ) { level.spawn_sequence[i] = create_spawn_group( i ); } } player_basic_needs() { players=GetPlayers(); for(i=0;i= level.arenas.size ) { level.current_arena = 0; level.arena_laps++; } if ( level.current_arena == arena_findIndexByName("temple") ) { maps\_zombietron_scenes::hide_temple_props( "none" ); } } end_of_round_cleanup() { if ( level.arenas[level.current_arena] == "prison" ) { players = GetPlayers(); for(i=0;i= level.desiredRound) { level.desiredRound = undefined; } level notify( "change_music_state" ); fade_in(); } } } end_game() { level waittill ( "end_the_game" ); wait 2; level.survived_msg FadeOverTime( 1 ); level.msg_t3 FadeOverTime( 1 ); level.survived_msg.alpha = 0; level.msg_t3.alpha = 0; wait 1; fade_out(); players = get_players(); for(i=0;i 0 || isDefined(self.stolen_life) ) { player_respawn(); return; } wait .2; } } life_link(source,dest) { self endon("disconnect"); level endon( "end_the_game" ); orb = Spawn( "script_model", self.origin + (0,0,50) ); orb SetModel("tag_origin"); PlayFxOnTag( level._effect["life_force"], orb, "tag_origin" ); orb thread destroy_me_on_player_notify(source,"disconnect"); orb thread destroy_me_on_player_notify(dest,"disconnect"); orb thread destroy_me_on_player_notify(source,"end_life_link"); while(isDefined(orb)) { orb moveto( dest.origin, 0.2, 0, 0 ); wait 0.2; if(isDefined(orb)) { orb.origin = source.origin; } } } steal_life_cooldown(time) { self endon("disconnect"); level endon( "end_the_game" ); self.stealing = 1; wait time; self.stealing = undefined; } steal_life_from(source,dest) { self endon("disconnect"); level endon( "end_the_game" ); if ( !isDefined(source) || source.lives < 1 ) return; if ( isDefined(source.stealing) ) return; if ( isDefined(dest.stealing) ) return; source thread steal_life_cooldown(10); dest thread steal_life_cooldown(level.zombie_vars["auto_respawn_timeout"]+5); source thread life_link(source,dest); wait 1; source.lives--; if (source.lives < 0 ) { source.lives = 0; } origin = source.origin; pickup = Spawn( "script_model", origin ); pickup.angles = source.angles; pickup SetModel( level.extra_life_model ); PlayFxOnTag( level._effect[source.light_playFX], pickup, "tag_origin" ); source thread maps\_zombietron_pickups::turn_shield_on(true); pickup moveto( dest.origin, 1, 0, 0 ); pickup PlayLoopSound( "zmb_pickup_life_shimmer" ); pickup waittill( "movedone" ); pickup Delete(); dest.stolen_life = true; source maps\_zombietron_score::update_hud(); reward = undefined; model = undefined; number = 1; while( !isDefined(reward) || maps\_zombietron_pickups::can_spawn_pickup( reward ) == false ) { i = RandomInt(level.reward_pickups.size); reward = level.reward_pickups[i]; switch(reward) { case "booster": model = level.booster_model; number = 4; break; case "bomb": model = level.bomb_model; number = 3; break; case "heli": model = level.heli_pickup_model; number = 1; break; case "tank": model = level.tank_pickup_model; number = 1; break; } wait 0.05; } while(number>0) { level thread maps\_zombietron_pickups::directed_pickup_award_to(source,reward,model); number--; wait 0.3; } source notify("end_life_link"); } player_automatic_respawn() { self endon("disconnect"); level endon( "end_the_game" ); original_time = level.zombie_vars["auto_respawn_timeout"]; time_left = original_time; while(!isAlive(self) && time_left>0 ) { wait 0.05; time_left -= 0.05; self.headshots = Int( (time_left / original_time) * 1000 ); } if (!isAlive(self)) { self player_respawn_now(); } self.headshots = 0; } player_steal_life() { self endon("disconnect"); level endon( "end_the_game" ); self thread player_respawn_if_extra_life(); self thread player_automatic_respawn(); while(self.lives == 0 && !isDefined(self.stolen_life ) && !level.gameEnded ) { wait 1; if ( isDefined(self.next_life_steal) && GetTime() < self.next_life_steal ) { continue; } players = GetPlayers(); richestPlayer = undefined; biggestLives = 0; for (i=0;i biggestLives ) { biggestLives = players[i].lives; richestPlayer = players[i]; } } if ( isDefined(richestPlayer) ) { level thread steal_life_from(richestPlayer,self); return; } } } player_respawn_now() { self maps\_zombietron_score::update_hud(); self PlaySound( "zmb_player_respawn" ); PlayFx( level._effect["respawn"], self.origin, AnglesToForward(self.angles) ); RadiusDamage( self.origin, 200, 10000, 10000, self ); self Spawn( self.origin, (0,0,0) ); self thread maps\_zombietron_pickups::turn_shield_on(); self SetPlayerCollision( 1 ); self TakeAllWeapons(); self GiveWeapon( self.default_weap ); self switchToWeapon( self.default_weap ); self.headshots = 0; self DisableWeaponCycling(); self AllowJump( false ); self AllowCrouch( false ); self AllowSprint( false ); self SetStance("stand"); self notify("player_respawned"); } player_respawn() { wait 2; if ( self.lives < 1 && !isDefined(self.stolen_life) ) return; if( level.gameEnded ) return; if ( !isDefined(self.stolen_life) ) { self.lives--; if ( self.lives < 0 ) { self.lives = 0; } } else { self.stolen_life = undefined; } self player_respawn_now(); } exit_cleanup() { level waittill( "exit_taken" ); wait .05; self notify( "trigger" ); } make_exit_magical( trigger ) { level endon("exit_taken"); trigger waittill( "trigger" ); level.lastmagical_exit_taken = level.round_number; level.magical_exit_taken = true; chance = level.zombie_vars["armory_chance"]; if ( level.round_number>=20 && !isDefined(level.lastmagical_armory) ) { chance = 100; } if ( level.round_number > 4 && RandomInt(100) < chance ) { level.magical_exit_armory = 1; level.lastmagical_armory = level.round_number; } } is_exit_open(label) { exit_triggers = get_environment_exits(); for ( i = 0; i< exit_triggers.size;i++ ) { if ( !isDefined(label) && isDefined(exit_triggers[i].exit_open) ) { return true; } else if ( exit_triggers[i].script_parameters == label && isDefined(exit_triggers[i].exit_open) ) { return true; } } return false; } open_exit( trigger, objective_id ) { blocker = GetEnt( trigger.target, "targetname" ); blocker.origin -= (0,0,500); trigger.exit_open = true; trigger thread exit_cleanup(); objective_add( objective_id, "active", &"EXIT", trigger.origin ); objective_set3d( objective_id, true, "default","*" ); objective_current( objective_id ); trigger waittill( "trigger" ); trigger.exit_open = undefined; blocker.origin += (0,0,500); objective_delete( objective_id ); wait 0.1; level notify( "exit_taken", trigger ); } open_exits(specific) { level.teleporter_spawned = true; exit_triggers = get_environment_exits(); if( exit_triggers.size != 4 ) { fade_out(); level.teleporter_spawned = false; return; } level.survived_msg.hidewheninmenu = true; level.survived_msg.alpha = 0; if ( level.magical_exit_taken ) { if ( isDefineD(level.magical_exit_armory) ) { level.survived_msg SetText( &"ZOMBIETRON_ARMORY"); } else { level.survived_msg SetText( &"ZOMBIETRON_BONUS"); } } else { if (level.round_number-1 > 0 ) { level.survived_msg SetText( &"ZOMBIETRON_ROUND_COMPLETE", level.round_number-1 ); } } level.survived_msg FadeOverTime( 1 ); level.survived_msg.alpha = 1; if ( isDefined(specific) ) { num_exits = 1; the_specific_exit = []; for ( i = 0; i< exit_triggers.size;i++ ) { if (exit_triggers[i].script_parameters == specific ) { the_specific_exit[the_specific_exit.size] = exit_triggers[i]; } } exit_triggers = the_specific_exit; } else { exit_triggers = randomize_array( exit_triggers ); num_exits = 1 + randomInt( 3 ); } if( level.arena_round_number == level.zombie_vars["zombie_arena_rounds"]) { num_exits = 1; } level.msg_t3.alpha = 0; magic_exit = undefined; if ( level.round_number - level.lastmagical_exit_taken > 2) { if ( num_exits > 1 ) { magic_exit = RandomInt(num_exits); } } opened_exits = 0; for( i = 0; i < num_exits; i++ ) { if( exit_triggers[i].script_parameters == level.previous_exit_taken ) { if ( isDefined(magic_exit) && magic_exit == i ) { magic_exit++; } i++; } if ( isDefined(magic_exit) && i == magic_exit ) { level thread make_exit_magical( exit_triggers[i] ); magic_exit = undefined; } level thread open_exit( exit_triggers[i], i ); opened_exits ++; PlaySoundAtPosition( "zmb_exit_open", exit_triggers[i].origin ); wait .2; } if (opened_exits > 1) { level.msg_t3 SetText( &"ZOMBIETRON_PICK_A_PATH" ); level.msg_t3 FadeOverTime( 1 ); level.msg_t3.alpha = 1; } flag_set("exits_open"); level waittill( "exit_taken", exit_trigger ); flag_clear("exits_open"); fade_out(); level.survived_msg FadeOverTime( 1 ); level.msg_t3 FadeOverTime( 1 ); level.survived_msg.alpha = 0; level.msg_t3.alpha = 0; level notify( "exit_taken_fadeout"); PlaySoundAtPosition( "zmb_exit_taken", exit_trigger.origin ); wait 1.7; level.previous_exit_taken = exit_trigger.script_parameters; level.teleporter_spawned = false; } Rotate() { self endon( "death" ); while( 1 ) { self rotateTo( self.angles + (0, 180, 0), 4 ); wait 4; } } spawn_teleporter(boss_battle) { level.teleporter_spawned = true; location = maps\_zombietron_pickups::get_random_pickup_location(); if( !IsDefined( location ) ) { return; } level.survived_msg SetText( &"ZOMBIETRON_ROUND_COMPLETE", level.round_number-1 ); level.msg_t3 SetText( &"ZOMBIETRON_TELEPORTER" ); level.survived_msg FadeOverTime( 1 ); level.msg_t3 FadeOverTime( 1 ); level.survived_msg.alpha = 1; level.msg_t3.alpha = 1; above = location.origin + (0,0,10); below = location.origin + (0,0,-500); hitp = PlayerPhysicsTrace(above, below); dest_point = (location.origin[0], location.origin[1], hitp[2]); start_point = dest_point + (0,0,-50); teleporter = Spawn( "script_model", start_point ); teleporter SetModel( "zombie_teleporter_pad" ); lights = []; if ( isDefined(level.is_nighttime) ) { next = lights.size; lights[next] = Spawn("script_model", start_point ); lights[next] SetModel("tag_origin"); lights[next] thread fake_linkto(teleporter,(0,0,50)); playfxontag(level._effect["white_light"], lights[next],"tag_origin"); next = lights.size; lights[next] = Spawn("script_model", start_point ); lights[next] SetModel("tag_origin"); lights[next] thread fake_linkto(teleporter,(0,72,50)); playfxontag(level._effect["coconut"], lights[next],"tag_origin"); next = lights.size; lights[next] = Spawn("script_model", start_point ); lights[next] SetModel("tag_origin"); lights[next] thread fake_linkto(teleporter,(72,0,50)); playfxontag(level._effect["coconut"], lights[next],"tag_origin"); next = lights.size; lights[next] = Spawn("script_model", start_point ); lights[next] SetModel("tag_origin"); lights[next] thread fake_linkto(teleporter,(0,-72,50)); playfxontag(level._effect["coconut"], lights[next],"tag_origin"); next = lights.size; lights[next] = Spawn("script_model", start_point ); lights[next] SetModel("tag_origin"); lights[next] thread fake_linkto(teleporter,(-72,0,50)); playfxontag(level._effect["coconut"], lights[next],"tag_origin"); } teleporter MoveTo( dest_point + (0,0,5), 3, 0, 0 ); teleporter thread Rotate(); physicsExplosionSphere( start_point, 200, 128, 4 ); teleporter waittill( "movedone" ); physicsExplosionSphere( start_point, 200, 128, 3 ); playsoundatposition( "zmb_teleporter_spawn", teleporter.origin ); trigger = spawn( "trigger_radius", location.origin + (0,0,-100), 0, 20, 200 ); trigger PlayLoopSound( "zmb_teleporter_loop", .5 ); trigger waittill( "trigger", player ); PlayRumbleOnPosition("artillery_rumble", location.origin); trigger StopLoopSound( .5 ); PlaySoundAtPosition( "zmb_teleporter_tele_out", (0,0,0) ); level.survived_msg FadeOverTime( 1 ); level.msg_t3 FadeOverTime( 1 ); level.survived_msg.alpha = 0; level.msg_t3.alpha = 0; if (boss_battle) { wait 1; level maps\_zombietron_spawner::the_big_boss_defeated("ape_zombie"); level notify("victory_movie_go"); level waittill("victory_movie_done"); } fade_out(); trigger Delete(); teleporter Delete(); if ( isDefined(lights) ) { for (i=0;i 0 ), "capacitors are missing!" ); for( i = 0; i < capacitors.size; i++ ) { playfx( level._effect[ "capacitor_light" ], capacitors[ i ].origin ); } } remove_ignore_attacker() { self notify( "new_ignore_attacker" ); self endon( "new_ignore_attacker" ); self endon( "disconnect" ); if( !isDefined( level.ignore_enemy_timer ) ) { level.ignore_enemy_timer = 0.4; } wait( level.ignore_enemy_timer ); self.ignoreAttacker = undefined; } init_function_overrides() { level.custom_introscreen = ::zombie_intro_screen; level.reset_clientdvars = ::onPlayerConnect_clientDvars; level.overridePlayerKilled = ::player_killed_override; level.overridePlayerDamage = ::player_damage_override; level.overrideActorDamage = ::actor_damage_override; level.melee_miss_func = ::zombiemode_melee_miss; level.callbackPlayerKilled = ::Callback_PlayerKilledZT; } initZombieLeaderboardData() { level.zombieLeaderboardStatVariable["zombietron"]["highestwave"] = "zombietron_highestwave"; level.zombieLeaderboardStatVariable["zombietron"]["timeinwave"] = "zombietron_timeinwave"; level.zombieLeaderboardStatVariable["zombietron"]["totalpoints"] = "zombietron_totalpoints"; level.zombieLeaderboardNumber["zombietron"]["waves"] = 3; level.zombieLeaderboardNumber["zombietron"]["points"] = 4; } zombie_intro_screen( string1, string2, string3, string4, string5 ) { flag_wait( "all_players_connected" ); wait( 1 ); setmusicstate( "SPLASH_SCREEN" ); wait (0.2); } onPlayerConnect_clientDvars() { self SetClientDvars( "cg_deadChatWithDead", "1", "cg_deadChatWithTeam", "1", "cg_deadHearTeamLiving", "1", "cg_deadHearAllLiving", "1", "cg_everyoneHearsEveryone", "1", "compass", "0", "hud_showStance", "0", "ammoCounterHide", "1", "miniscoreboardhide", "1", "ui_hud_hardcore", "0", "player_topDownCamMode", "3", "ai_corpseCount", "14", "waypointOffscreenPointerHeight", "30", "waypointOffscreenPointerWidth", "70", "cg_drawSpectatorMessages", "0", "sm_sunSampleSizeNear", ".57", "playerPushAmount", "1" ); self SetDepthOfField( 0, 0, 512, 4000, 4, 0 ); self setClientDvars( "aim_lockon_pitch_strength", 0.0,"player_topDownCamOffset", (0, -15, 650),"player_TopDownCamAngles", (75,0,0),"cg_fov", 65 ); } player_killed_override() { level waittill( "forever" ); } player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) { if ( isDefined(self.shield_is_on) ) { self ClearDamageIndicator(); return 0; } if( isDefined( eAttacker ) ) { if( isDefined( self.ignoreAttacker ) && self.ignoreAttacker == eAttacker ) { return 0; } if( (isDefined( eAttacker.is_zombie ) && eAttacker.is_zombie) ) { self.ignoreAttacker = eAttacker; self thread remove_ignore_attacker(); if ( !isdefined( eAttacker.meleeDamage ) ) { iDamage = 45; } else if ( isdefined( eAttacker.custom_damage_func ) ) { iDamage = eAttacker [[ eAttacker.custom_damage_func ]](); } else { iDamage = eAttacker.meleeDamage; } } eAttacker notify( "hit_player" ); } finalDamage = iDamage; if( sMeansOfDeath == "MOD_PROJECTILE" || sMeansOfDeath == "MOD_RIFLE_BULLET" || sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" || sMeansOfDeath == "MOD_BURNED" ) { if ( !(sMeansOfDeath == "MOD_PROJECTILE_SPLASH" && isDefined(eAttacker.is_zombie)) ) { self ClearDamageIndicator(); return 0; } } if( iDamage < self.health ) { if ( IsDefined( eAttacker ) ) { eAttacker.sound_damage_player = self; } return finalDamage; } return finalDamage; } actor_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, modelIndex, psOffsetTime ) { if( !isdefined( self) || !isdefined( attacker ) ) return damage; if ( !isplayer( attacker ) && !isplayer( self ) ) return damage; if( !isdefined( damage ) || !isdefined( meansofdeath ) ) return damage; if( meansofdeath == "" ) return damage; final_damage = damage; if ( IsDefined( self.actor_damage_func ) ) { final_damage = [[ self.actor_damage_func ]]( weapon, final_damage ); } if( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) attacker = attacker.owner; return int( final_damage ); } zombiemode_melee_miss() { if( isDefined( self.enemy.curr_pay_turret ) ) { self.enemy doDamage( GetDvarInt( #"ai_meleeDamage" ), self.origin, self, undefined, "melee", "none" ); } } Callback_PlayerKilledZT( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) { self PlaySound( "zmb_player_death" ); self notify("player_died"); self.headshots = 0; self SetPlayerCollision( 0 ); self maps\_zombietron_score::update_multiplier_bar( 0 ); if ( isDefined(level.round_end_time) && level.round_start_time < level.round_end_time ) { self.zombification_time = level.round_end_time - level.round_start_time; } else { self.zombification_time = GetTime() - level.round_start_time; } if( self.lives == 0 ) { players = get_players(); count = 0; for( i = 0; i < players.size; i++ ) { if( !isAlive(players[i]) && players[i].lives == 0 && !isDefined(players[i].stolen_life) ) { count++; } } if( count == players.size ) { level notify( "end_the_game" ); } else { self thread player_steal_life(); } } else { self thread player_respawn(); } } get_environment_exits() { return level.arena_exits[level.current_arena]; } setup_exits() { level.arena_exits = []; for( i = 0; i < level.arenas.size; i++ ) { arena = level.arenas[i]; level.arena_exits[i] = GetEntArray( arena + "_exit", "script_noteworthy" ); } } detect_and_change_music_states() { wait_for_all_players(); setmusicstate( level.arenas[level.current_arena] ); last_arena = level.current_arena; while(1) { level waittill( "change_music_state" ); if( level.magical_exit_taken && last_arena != 96 ) { setmusicstate( "bonus" ); last_arena = 96; continue; } else if( level.music_state_fate_round ) { setmusicstate( "fate" ); level.music_state_fate_round = false; last_arena = 97; continue; } else if( maps\_zombietron_challenges::is_this_a_challenge_round(level.round_number) ) { if( level.round_number == 40 ) { setmusicstate( "boss" ); last_arena = 98; } else { setmusicstate( "challenge" ); last_arena = 99; } continue; } else if( level.current_arena != last_arena ) { last_arena = level.current_arena; setmusicstate( level.arenas[level.current_arena] ); last_music_state = level.arenas[level.current_arena]; continue; } } } zombietron_upload_highscore() { playersRank = 1; if( level.players_playing == 1 ) playersRank = 4; else if( level.players_playing == 2 ) playersRank = 3; else if( level.players_playing == 3 ) playersRank = 2; map_name = GetDvar( #"mapname" ); if ( !isZombieLeaderboardAvailable( map_name, "waves" ) || !isZombieLeaderboardAvailable( map_name, "points" ) ) return; players = get_players(); for( i = 0; i < players.size; i++ ) { pre_highest_wave = players[i] playerZombieStatGet( map_name, "highestwave" ); pre_time_in_wave = players[i] playerZombieStatGet( map_name, "timeinwave" ); new_highest_wave = level.round_number + "" + playersRank; new_highest_wave = int( new_highest_wave ); if( new_highest_wave >= pre_highest_wave ) { if( players[i].zombification_time == 0 ) { players[i].zombification_time = GetTime() - level.round_start_time; } player_survival_time = players[i].zombification_time; player_survival_time = int( player_survival_time/1000 ); if( new_highest_wave > pre_highest_wave || player_survival_time > pre_time_in_wave ) { rankNumber = makeRankNumber( level.round_number, playersRank, player_survival_time ); leaderboard_number = getZombieLeaderboardNumber( map_name, "waves" ); players[i] UploadScore( leaderboard_number, int(rankNumber), level.round_number, player_survival_time, level.players_playing ); players[i] playerZombieStatSet( map_name, "highestwave", new_highest_wave ); players[i] playerZombieStatSet( map_name, "timeinwave", player_survival_time ); } } pre_total_points = players[i] playerZombieStatGet( map_name, "totalpoints" ); if( players[i].score > pre_total_points ) { leaderboard_number = getZombieLeaderboardNumber( map_name, "points" ); players[i] UploadScore( leaderboard_number, players[i].score, players[i].kills, level.players_playing ); players[i] playerZombieStatSet( map_name, "totalpoints", players[i].score ); } } } isZombieLeaderboardAvailable( map, type ) { if ( !isDefined( level.zombieLeaderboardNumber[map] ) ) return 0; if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) ) return 0; return 1; } getZombieLeaderboardNumber( map, type ) { if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) ) assertMsg( "Unknown leaderboard number for map " + map + "and type " + type ); return level.zombieLeaderboardNumber[map][type]; } getZombieStatVariable( map, variable ) { if ( !isDefined( level.zombieLeaderboardStatVariable[map][variable] ) ) assertMsg( "Unknown stat variable " + variable + " for map " + map ); return level.zombieLeaderboardStatVariable[map][variable]; } playerZombieStatGet( map, variable ) { stat_variable = getZombieStatVariable( map, variable ); result = self zombieStatGet( stat_variable ); if (!isDefined(result)) { result = 0; } return result; } playerZombieStatSet( map, variable, value ) { if (!isDefined(value) ) { value = 0; } stat_variable = getZombieStatVariable( map, variable ); self zombieStatSet( stat_variable, value ); } zombietron_set_new_zombie_stats() { players = get_players(); for( i = 0; i < players.size; i++ ) { total_kills = players[i] zombieStatGet( "zombie_kills" ) + players[i].stats["kills"]; total_points = players[i] zombieStatGet( "zombie_points" ) + players[i].stats["score"]; total_rounds = players[i] zombieStatGet( "zombie_rounds" ) + (level.round_number - 1); players[i] zombieStatSet( "zombie_kills", total_kills ); players[i] zombieStatSet( "zombie_points", total_points ); players[i] zombieStatSet( "zombie_rounds", total_rounds ); } } makeRankNumber( wave, players, time ) { if( time > 86400 ) time = 86400; padding = ""; if ( 10 > time ) padding += "0000"; else if( 100 > time ) padding += "000"; else if( 1000 > time ) padding += "00"; else if( 10000 > time ) padding += "0"; rank = wave + "" + players + padding + time; return rank; } zombieStatGet( dataName ) { if( level.systemLink ) { return 0; } if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size ) { return 0; } return ( self getdstat( "PlayerStatsList", dataName ) ); } zombieStatSet( dataName, value ) { if( level.systemLink ) { return; } if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size ) { return; } if (!isDefined(value) ) { value = 0; } self setdstat( "PlayerStatsList", dataName, value ); }