1 #using scripts\codescripts\struct;
3 #using scripts\shared\aat_shared;
4 #using scripts\shared\ai_puppeteer_shared;
5 #using scripts\shared\archetype_shared\archetype_shared;
6 #using scripts\shared\array_shared;
7 #using scripts\shared\callbacks_shared;
8 #using scripts\shared\clientfield_shared;
9 #using scripts\shared\demo_shared;
10 #using scripts\shared\flag_shared;
11 #using scripts\shared\hud_util_shared;
12 #using scripts\shared\laststand_shared;
13 #using scripts\shared\lui_shared;
14 #using scripts\shared\math_shared;
15 #using scripts\shared\scoreevents_shared;
16 #using scripts\shared\system_shared;
17 #using scripts\shared\util_shared;
18 #using scripts\shared\visionset_mgr_shared;
19 #using scripts\zm\gametypes\_globallogic;
20 #using scripts\zm\gametypes\_globallogic_vehicle;
22 #using scripts\zm\_bb;
24 #using scripts\shared\ai\systems\gib;
26 #insert scripts\shared\shared.gsh;
27 #insert scripts\shared\version.gsh;
28 #insert scripts\shared\ai\systems\gib.gsh;
29 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
31 #using scripts\zm\gametypes\_weapons;
32 #using scripts\zm\gametypes\_zm_gametype;
33 #using scripts\zm\gametypes\_globallogic_spawn;
34 #using scripts\zm\gametypes\_globallogic_player;
36 #using scripts\zm\_util;
37 #using scripts\zm\_zm_attackables;
38 #using scripts\zm\_zm_audio;
39 #using scripts\zm\_zm_bgb;
40 #using scripts\zm\_zm_bgb_token;
41 #using scripts\zm\_zm_blockers;
42 #using scripts\zm\_zm_bot;
43 #using scripts\zm\_zm_daily_challenges;
44 #using scripts\zm\_zm_equipment;
45 #using scripts\zm\_zm_ffotd;
46 #using scripts\zm\_zm_game_module;
48 #using scripts\zm\_zm_laststand;
49 #using scripts\zm\_zm_melee_weapon;
50 #using scripts\zm\_zm_perks;
51 #using scripts\zm\_zm_pers_upgrades;
52 #using scripts\zm\_zm_pers_upgrades_functions;
53 #using scripts\zm\_zm_pers_upgrades_system;
54 #using scripts\zm\_zm_placeable_mine;
55 #using scripts\zm\_zm_player;
56 #using scripts\zm\_zm_powerups;
57 #using scripts\zm\_zm_score;
58 #using scripts\zm\_zm_spawner;
59 #using scripts\zm\_zm_stats;
60 #using scripts\zm\_zm_timer;
61 #using scripts\zm\_zm_unitrigger;
62 #using scripts\zm\_zm_utility;
63 #using scripts\zm\_zm_weapons;
64 #using scripts\zm\_zm_zonemgr;
65 #using scripts\shared\ai_shared;
68 #insert scripts\shared\aat_zm.gsh;
69 #using scripts\zm\aats\_zm_aat_blast_furnace;
70 #using scripts\zm\aats\_zm_aat_dead_wire;
71 #using scripts\zm\aats\_zm_aat_fire_works;
72 #using scripts\zm\aats\_zm_aat_thunder_wall;
73 #using scripts\zm\aats\_zm_aat_turned;
75 #using scripts\zm\craftables\_zm_craftables;
77 #using scripts\shared\ai\zombie_death;
78 #using scripts\shared\ai\zombie_utility;
80 #insert scripts\shared\ai\zombie.gsh;
81 #insert scripts\zm\_zm_laststand.gsh;
82 #insert scripts\zm\_zm_perks.gsh;
83 #insert scripts\zm\_zm_utility.gsh;
85 #precache( "material", "hud_chalk_1" );
86 #precache( "material", "hud_chalk_2" );
87 #precache( "material", "hud_chalk_3" );
88 #precache( "material", "hud_chalk_4" );
89 #precache( "material", "hud_chalk_5" );
91 #precache( "material", "zom_icon_community_pot" );
92 #precache( "material", "zom_icon_community_pot_strip" );
94 #precache( "material","zom_icon_player_life");
96 #precache( "string", "ZOMBIE_WEAPONCOSTAMMO" );
97 #precache( "string", "ZOMBIE_ROUND" );
98 #precache( "string", "SCRIPT_PLUS" );
99 #precache( "string", "ZOMBIE_GAME_OVER" );
100 #precache( "string", "ZOMBIE_SURVIVED_ROUND" );
101 #precache( "string", "ZOMBIE_SURVIVED_ROUNDS" );
102 #precache( "string", "ZOMBIE_SURVIVED_NOMANS" );
103 #precache( "string", "ZOMBIE_EXTRA_LIFE" );
104 #precache( "string", "ZOMBIE_UNDEFINED" );
105 #precache( "triggerstring", "ZOMBIE_ELECTRIC_SWITCH" );
106 #precache( "triggerstring", "ZOMBIE_NEED_POWER" );
108 #precache( "string", "ZOMBIE_RANDOM_WEAPON_COST" );
110 #precache( "string", "ZOMBIE_WEAPON_COSTONLYFILL_500" );
111 #precache( "triggerstring", "ZOMBIE_WEAPON_COSTONLYFILL_2000" );
112 #precache( "triggerstring", "ZOMBIE_WEAPONAMMOONLY_250" );
113 #precache( "triggerstring", "ZOMBIE_WEAPONCOSTAMMO_UPGRADE_500_250" );
115 #precache( "string", "ZOMBIE_BUTTON_BUY_BACK_BARRIER_10" );
116 #precache( "string", "ZOMBIE_BUTTON_BUY_BACK_BARRIER_20" );
117 #precache( "string", "ZOMBIE_BUTTON_BUY_BACK_BARRIER_50" );
118 #precache( "string", "ZOMBIE_BUTTON_BUY_BACK_BARRIER_100" );
120 #precache( "string", "ZOMBIE_BUTTON_REWARD_BARRIER" );
122 #precache( "string", "ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_COST" );
124 #precache( "string", "ZOMBIE_BUTTON_BUY_OPEN_DOOR_COST" );
125 #precache( "string", "ZOMBIE_BUTTON_BUY_CLOSE_DOOR" );
127 #precache( "triggerstring", "ZOMBIE_BUTTON_REWARD_BARRIER" );
129 #precache( "fx", "_t6/maps/zombie/fx_zombie_bar_break" );
130 #precache( "fx", "_t6/maps/zombie/fx_zombie_bar_break_lite" );
131 #precache( "fx", "_t6/maps/zombie/fx_fog_zombie_amb" );
132 #precache( "fx", "zombie/fx_weapon_box_open_glow_zmb" );
133 #precache( "fx", "zombie/fx_weapon_box_closed_glow_zmb" );
134 #precache( "fx", "zombie/fx_glow_eye_orange" );
135 #precache( "fx", "zombie/fx_bul_flesh_head_fatal_zmb" );
136 #precache( "fx", "zombie/fx_bul_flesh_head_nochunks_zmb" );
137 #precache( "fx", "zombie/fx_bul_flesh_neck_spurt_zmb" );
138 #precache( "fx", "_t6/maps/zombie/fx_zombie_tesla_neck_spurt" );
139 #precache( "fx", "zombie/fx_blood_torso_explo_zmb" );
140 #precache( "fx", "zombie/fx_blood_torso_explo_lg_zmb" );
141 #precache( "fx", "zombie/fx_spawn_dirt_hand_burst_zmb" );
142 #precache( "fx", "zombie/fx_spawn_dirt_body_billowing_zmb" );
143 #precache( "fx", "zombie/fx_spawn_dirt_body_dustfalling_zmb" );
144 #precache( "fx", "zombie/fx_fire_torso_zmb" );
145 #precache( "fx", "_t6/explosions/fx_default_explosion" );
146 #precache( "fx", "_t6/maps/zombie/fx_zmb_tanzit_upgrade" );
148 #precache( "menu", "StartMenu_Main" );
149 #precache( "menu", "InitialBlack" );
151 #precache( "eventstring", "force_scoreboard" );
152 #precache( "eventstring", "open_ingame_menu" );
153 #precache( "eventstring", "play_promo_anim" );
155 #precache( "string", "ZOMBIE_REVIVING_SOLO", "ZOMBIE_PLAYER_NAME_0" );
156 #precache( "string", "ZOMBIE_REVIVING_SOLO", "ZOMBIE_PLAYER_NAME_1" );
157 #precache( "string", "ZOMBIE_REVIVING_SOLO", "ZOMBIE_PLAYER_NAME_2" );
158 #precache( "string", "ZOMBIE_REVIVING_SOLO", "ZOMBIE_PLAYER_NAME_3" );
218 SetDvar(
"doublejump_enabled", 0 );
219 SetDvar(
"juke_enabled", 0 );
220 SetDvar(
"playerEnergy_enabled", 0 );
221 SetDvar(
"wallrun_enabled", 0 );
222 SetDvar(
"sprintLeap_enabled", 0 );
223 SetDvar(
"traverse_mode", 2 );
224 SetDvar(
"weaponrest_enabled", 0 );
227 SetDvar(
"ui_allowDisplayContinue",
true );
229 if ( !IsDefined( level.killstreakWeapons ) )
231 level.killstreakWeapons = [];
234 level.weaponNone = GetWeapon(
"none" );
235 level.weaponNull = GetWeapon(
"weapon_null" );
236 level.weaponBaseMelee = GetWeapon(
"knife" );
237 level.weaponBaseMeleeHeld = GetWeapon(
"knife_held" );
238 level.weaponBallisticKnife = GetWeapon(
"knife_ballistic" );
239 DEFAULT(level.weaponRiotshield,GetWeapon(
"riotshield" ));
240 level.weaponReviveTool = GetWeapon(
"syrette" );
241 level.weaponZMDeathThroe = GetWeapon(
"death_throe" );
242 level.weaponZMFists = GetWeapon(
"zombie_fists" );
246 level.projectiles_should_ignore_world_pause =
true;
248 level.player_out_of_playable_area_monitor =
true;
249 level.player_too_many_weapons_monitor =
true;
252 level.player_too_many_players_check =
true;
255 level._use_choke_weapon_hints = 1;
256 level._use_choke_blockers = 1;
258 level.speed_change_round = 15;
260 level.passed_introscreen =
false;
262 if(!isdefined(level.custom_ai_type))
264 level.custom_ai_type = [];
267 level.custom_ai_spawn_check_funcs = [];
272 level.zombiemode =
true;
273 level.reviveFeature =
false;
274 level.swimmingFeature =
false;
275 level.calc_closest_player_using_paths =
false;
276 level.zombie_melee_in_water =
true;
277 level.put_timed_out_zombies_back_in_queue =
true;
278 level.use_alternate_poi_positioning =
true;
279 level.zmb_laugh_alias =
"zmb_laugh_child";
280 level.sndAnnouncerIsRich =
true;
282 level.scr_zm_ui_gametype = GetDvarString(
"ui_gametype" );
283 level.scr_zm_ui_gametype_group =
"";
284 level.scr_zm_map_start_location =
"";
286 level.curr_gametype_affects_rank =
false;
287 gametype = toLower( GetDvarString(
"g_gametype" ) );
288 if (
"zclassic" == gametype ||
"zstandard" == gametype )
290 level.curr_gametype_affects_rank =
true;
293 level.grenade_multiattack_bookmark_count = 1;
302 if( !isdefined( level._zombies_round_spawn_failsafe ) )
310 level.zombie_visionset =
"zombie_neutral";
312 level.wait_and_revive =
false;
314 if(GetDvarString(
"anim_intro") ==
"1")
316 level.zombie_anim_intro = 1;
320 level.zombie_anim_intro = 0;
327 level._ZOMBIE_GIB_PIECE_INDEX_ALL = 0;
328 level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM = 1;
329 level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM = 2;
330 level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG = 3;
331 level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG = 4;
332 level._ZOMBIE_GIB_PIECE_INDEX_HEAD = 5;
333 level._ZOMBIE_GIB_PIECE_INDEX_GUTS = 6;
334 level._ZOMBIE_GIB_PIECE_INDEX_HAT = 7;
337 if ( !isdefined( level.zombie_ai_limit ) )
339 level.zombie_ai_limit = 24;
341 if ( !isdefined( level.zombie_actor_limit ) )
343 level.zombie_actor_limit = 31;
368 level.zombie_poi_array = getEntArray(
"zombie_poi",
"script_noteworthy" );
387 if ( GetPlayers().size <= 1 )
389 incrementCounter(
"global_solo_games", 1 );
391 else if(
IS_TRUE(level.systemLink) )
393 incrementCounter(
"global_systemlink_games", 1 );
395 else if ( GetDvarInt(
"splitscreen_playerCount" ) == GetPlayers().size )
397 incrementCounter(
"global_splitscreen_games", 1 );
401 incrementCounter(
"global_coop_games", 1 );
429 if ( GetDvarInt(
"zombie_cheat" ) >= val )
442 if ( new_round > 255 )
444 level.round_number = new_round;
449 return level.round_number;
463 level waittill(
"connected", player);
473 if( IsDefined( hold_black_time ) )
475 wait hold_black_time;
482 if( !IsDefined( fade_out_time ) )
495 level.passed_introscreen =
true;
497 players = GetPlayers();
498 for(i = 0; i < players.size; i++)
500 if( IsDefined( level.customHudReveal ) )
502 players[i] thread [[level.customHudReveal]]();
509 if(!
IS_TRUE(level.host_ended_game))
511 if (isdefined(level.player_movement_suppressed))
513 players[i] FreezeControls(level.player_movement_suppressed);
514 /# println(
" Unfreeze controls 4"); #/
519 if(!
IS_TRUE(players[i].hostMigrationControlsFrozen))
521 players[i] FreezeControls(
false);
523 /# println(
" Unfreeze controls 5"); #/
530 level
flag::set(
"initial_blackscreen_passed");
536 self setClientUIVisibilityFlag(
"hud_visible", 1 );
537 self setClientUIVisibilityFlag(
"weapon_hud_visible", 1 );
539 if( !
IS_TRUE(
self.seen_promo_anim ) && SessionModeIsOnlineGame() )
541 self LUINotifyEvent( &
"play_promo_anim", 0 );
542 self.seen_promo_anim =
true;
549 timeOut = GetTime() + 5000;
551 while(IsLoadingCinematicPlaying() || (GetNumExpectedPlayers() == 0 && (GetTime() < timeOut)))
556 /# println(
"ZM >> player_count_expected=" + GetNumExpectedPlayers()); #/
557 player_count_actual = 0;
558 while( (GetNumConnectedPlayers() < GetNumExpectedPlayers()) || (player_count_actual != GetNumExpectedPlayers()) )
560 players = GetPlayers();
561 player_count_actual = 0;
562 for( i = 0; i < players.size; i++ )
564 players[i] FreezeControls(
true );
565 if( players[i].sessionstate ==
"playing" )
567 player_count_actual++;
571 /# println(
"ZM >> Num Connected =" + GetNumConnectedPlayers() +
" Expected : " + GetNumExpectedPlayers()); #/
575 SetInitialPlayersConnected();
578 SetDvar(
"all_players_are_connected",
"1" );
580 /# println(
"ZM >> We have all players - START ZOMBIE LOGIC" ); #/
585 if ( (1 == GetNumConnectedPlayers()) && (GetDvarInt(
"scr_zm_enable_bots" )==1) )
588 level
flag::set(
"initial_players_connected");
592 players = GetPlayers();
593 if ( players.size == 1 )
596 level.solo_lives_given = 0;
597 foreach ( player
in players )
604 level
flag::set(
"initial_players_connected");
608 while ( !AreTexturesLoaded() )
613 if ( isdefined(level.added_initial_streamer_blackscreen) )
615 wait(level.added_initial_streamer_blackscreen);
624 n_black_screen = 5.0;
629 level.n_gameplay_start_time = GetTime();
635 self CloseMenu(
"InitialBlack" );
636 self OpenMenu(
"InitialBlack" );
641 self CloseMenu(
"InitialBlack" );
649 wait( time_to_wait );
650 level
flag::set(
"start_zombie_round_logic" );
659 for(i = 0; i < level.players.size; i++)
661 if ( !isdefined( level.players[i] ) )
663 player = level.players[i];
665 if ( player.sessionstate !=
"playing" || player ==
self )
668 aliveplayers[aliveplayers.size] = player;
675 if(!Isdefined(player.playernum))
677 if(player.team ==
"allies")
693 if(!isdefined(spawnpoints))
696 iprintlnbold(
"ZM >> No free spawn points in map" );
703 if(!isdefined(game[
"spawns_randomized"]))
705 game[
"spawns_randomized"] =
true;
707 spawnpoints = array::randomize(spawnpoints);
709 random_chance = randomint(100);
710 if(random_chance > 50)
725 if(side_selection == 2)
729 else if(side_selection == 1)
735 if(IsDefined(player) && IsDefined(player.team))
738 while(IsDefined(spawnpoints) && i < spawnpoints.size)
740 If(side_selection == 1)
742 if(player.team !=
"allies" && (IsDefined(spawnpoints[i].script_int) && spawnpoints[i].script_int == 1))
744 ArrayRemoveValue(spawnpoints, spawnpoints[i]);
747 else if(player.team ==
"allies" && (IsDefined(spawnpoints[i].script_int) && spawnpoints[i].script_int == 2))
749 ArrayRemoveValue(spawnpoints, spawnpoints[i]);
759 if(player.team ==
"allies" && (IsDefined(spawnpoints[i].script_int) && spawnpoints[i].script_int == 1))
761 ArrayRemoveValue(spawnpoints, spawnpoints[i]);
764 else if(player.team !=
"allies" && (IsDefined(spawnpoints[i].script_int) && spawnpoints[i].script_int == 2))
766 ArrayRemoveValue(spawnpoints, spawnpoints[i]);
779 for( j = 0; j < spawnpoints.size; j++ )
781 if(!IsDefined(spawnpoints[j].en_num))
783 for( m = 0; m < spawnpoints.size; m++ )
785 spawnpoints[m].en_num = m;
789 if( spawnpoints[j].en_num == player.playernum)
791 return spawnpoints[j];
795 return spawnpoints[0];
802 for( i = 0; i < exterior_goals.size; i++ )
804 if( !IsDefined( exterior_goals[i].target ) )
808 targets = GetEntArray( exterior_goals[i].target,
"targetname" );
810 for( j = 0; j < targets.size; j++ )
816 if(isdefined(level.level_createfx_callback_thread))
818 level thread [[level.level_createfx_callback_thread]]();
827 host = util::GetHostPlayer();
828 while ( !IsDefined( host ) )
831 host = util::GetHostPlayer();
838 SetDvar(
"bot_AllowMovement",
"1");
839 SetDvar(
"bot_PressAttackBtn",
"1");
840 SetDvar(
"bot_PressMeleeBtn",
"1");
843 while( GetPlayers().size<2 )
849 players = GetPlayers();
850 for( i = 0; i < players.size; i++ )
852 players[i] FreezeControls(
false );
853 /# println(
" Unfreeze controls 6"); #/
857 level.numberBotsAdded = 1;
858 level
flag::set(
"start_zombie_round_logic" );
863 player = util::GetHostPlayer();
868 bot = AddTestClient();
869 if ( !IsDefined( bot ) )
871 /# println(
"Could not add test client" ); #/
878 bot.pers[
"isBot"] =
true;
879 bot.equipment_enabled =
false;
880 yaw = spawnPoint.angles[1];
895 level.dash_counter_start_player_count = level.players.size;
897 println(
"sessions: mapname=", level.script,
" gametype zom isserver 1 player_count=", GetPlayers().size );
902 if(!level.zombie_anim_intro)
904 if(isDefined(level._round_start_func))
906 level thread [[level._round_start_func]]();
912 DisableGrenadeSuicide();
913 level.startInvulnerableTime = GetDvarInt(
"player_deathInvulnerableTime" );
936 level waittill(
"start_of_round" );
938 if( !IsDefined( level.dash_counter_round_reached_5 ) && level.round_number >= 5 )
940 level.dash_counter_round_reached_5 =
true;
944 if( !IsDefined( level.dash_counter_round_reached_10 ) && level.round_number >= 10 )
946 level.dash_counter_round_reached_10 =
true;
958 if( isDefined( level.custom_ai_type ) )
960 for( i = 0; i < level.custom_ai_type.size; i++ )
962 [[ level.custom_ai_type[i] ]]();
969 if( isDefined(
self.enemy.curr_pay_turret ) )
971 self.enemy doDamage( GetDvarInt(
"ai_meleeDamage" ),
self.origin,
self,
self,
"none",
"melee" );
980 self notify(
"stop_ammo_tracking" );
981 self endon(
"disconnect" );
982 self endon(
"stop_ammo_tracking" );
990 weapon =
self getcurrentweapon();
992 if ( weapon == level.weaponNone || weapon.skiplowammovox )
997 if( weapon.type ==
"grenade" )
1009 if (
self GetAmmoCount( weapon ) > 0 )
1011 if ( ammoLowCount < 1 )
1019 if ( ammoOutCount < 1 )
1023 if( (
self getcurrentweapon() ) !== weapon )
1044 players = GetPlayers();
1047 if(players.size > 1)
1049 player = array::random(players);
1058 sound =
"plr_" + index +
"_vox_" + num +
"play";
1059 self PlaySoundWithNotify(sound,
"sound_done");
1060 self waittill(
"sound_done");
1065 if ( isDefined( level.precacheCustomCharacters ) )
1067 self [[ level.precacheCustomCharacters ]]();
1073 level.player_killed_shellshock =
"zombie_death";
1151 level.is_zombie_level =
true;
1152 level.default_laststandpistol = GetWeapon(
"pistol_standard" );
1153 level.default_solo_laststandpistol = GetWeapon(
"pistol_standard_upgraded" );
1154 level.super_ee_weapon = GetWeapon(
"pistol_burst" );
1155 level.laststandpistol = level.default_laststandpistol;
1156 level.start_weapon = level.default_laststandpistol;
1157 level.first_round =
true;
1158 level.start_round = GetGametypeSetting(
"startRound" );
1159 level.round_number = level.start_round;
1160 level.enable_magic = GetGametypeSetting(
"magic" );
1161 level.headshots_only = GetGametypeSetting(
"headshotsonly" );
1162 level.player_starting_points = level.round_number * 500;
1163 level.round_start_time = 0;
1164 level.pro_tips_start_time = 0;
1165 level.intermission =
false;
1166 level.dog_intermission =
false;
1167 level.zombie_total = 0;
1168 level.zombie_respawns = 0;
1169 level.total_zombies_killed = 0;
1170 level.hudelem_count = 0;
1171 level.zm_loc_types = [];
1172 level.zm_loc_types[
"zombie_location" ] = [];
1174 level.zm_variant_type_max = [];
1175 level.zm_variant_type_max[
"walk" ] = [];
1176 level.zm_variant_type_max[
"run" ] = [];
1177 level.zm_variant_type_max[
"sprint" ] = [];
1178 level.zm_variant_type_max[
"super_sprint" ] = [];
1179 level.zm_variant_type_max[
"walk" ][
"down" ] = 14;
1180 level.zm_variant_type_max[
"walk" ][
"up" ] = 16;
1181 level.zm_variant_type_max[
"run" ][
"down" ] = 13;
1182 level.zm_variant_type_max[
"run" ][
"up" ] = 12;
1183 level.zm_variant_type_max[
"sprint" ][
"down" ] = 9;
1184 level.zm_variant_type_max[
"sprint" ][
"up" ] = 8;
1185 level.zm_variant_type_max[
"super_sprint" ][
"down" ] = 1;
1186 level.zm_variant_type_max[
"super_sprint" ][
"up" ] = 1;
1187 level.zm_variant_type_max[
"burned" ][
"down" ] = 1;
1188 level.zm_variant_type_max[
"burned" ][
"up" ] = 1;
1189 level.zm_variant_type_max[
"jump_pad_super_sprint" ][
"down" ] = 1;
1190 level.zm_variant_type_max[
"jump_pad_super_sprint" ][
"up" ] = 1;
1192 level.current_zombie_array = [];
1193 level.current_zombie_count = 0;
1194 level.zombie_total_subtract = 0;
1195 level.destructible_callbacks = [];
1197 foreach( team
in level.teams )
1199 DEFAULT( level.zombie_vars[ team ], [] );
1203 column = int(difficulty) + 1;
1253 if ( IsSplitScreen() )
1260 level.gamedifficulty = GetGametypeSetting(
"zmDifficulty" );
1262 if( level.gamedifficulty == 0 )
1264 level.zombie_move_speed = level.round_number * level.zombie_vars[
"zombie_move_speed_multiplier_easy"];
1268 level.zombie_move_speed = level.round_number * level.zombie_vars[
"zombie_move_speed_multiplier"];
1272 if ( level.round_number == 1 )
1274 level.zombie_move_speed = 1;
1277 level.speed_change_max = 0;
1278 level.speed_change_num = 0;
1288 column = int(difficulty) + 1;
1290 for(i = 0; i < 8; i ++)
1307 if( GetDvarString(
"zombie_debug" ) ==
"" )
1309 SetDvar(
"zombie_debug",
"0" );
1312 if( GetDvarString(
"scr_zm_enable_bots" ) ==
"" )
1314 SetDvar(
"scr_zm_enable_bots",
"0" );
1317 if( GetDvarString(
"zombie_cheat" ) ==
"" )
1319 SetDvar(
"zombie_cheat",
"0" );
1322 if ( GetDvarString(
"zombiemode_debug_zombie_count") ==
"" )
1324 SetDvar(
"zombiemode_debug_zombie_count",
"0");
1327 if ( level.script !=
"zombie_cod5_prototype" )
1329 SetDvar(
"magic_chest_movable",
"1" );
1332 SetDvar(
"revive_trigger_radius",
"75" );
1334 SetDvar(
"scr_deleteexplosivesonspawn",
"0" );
1375 self endon(
"disconnect" );
1382 if( event ==
"broken" )
1384 notify_type = param1;
1388 if ( IsDefined( level.destructible_callbacks[ notify_type ] ) )
1390 self thread [[level.destructible_callbacks[ notify_type ]]]( notify_type, attacker );
1393 self notify( event, notify_type, attacker );
1395 else if( event ==
"breakafter" )
1406 self notify(
"breakafter" );
1407 self endon(
"breakafter" );
1412 self dodamage(
damage,
self.origin, undefined, undefined );
1415 function Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, vSurfaceNormal )
1417 startedInLastStand = 0;
1418 if ( isPlayer(
self) )
1423 /# println(
"ZM Callback_PlayerDamage"+iDamage+
"\n"); #/
1424 if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && (eAttacker.sessionteam ==
self.sessionteam) && !eAttacker HasPerk(
"specialty_playeriszombie" ) && !
IS_TRUE(
self.
is_zombie ) )
1426 self process_friendly_fire_callbacks( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, boneIndex );
1427 if (
self != eAttacker )
1430 /# println(
"Exiting - players can't hurt each other."); #/
1435 else if ( sMeansOfDeath !=
"MOD_GRENADE_SPLASH"
1436 && sMeansOfDeath !=
"MOD_GRENADE"
1437 && sMeansOfDeath !=
"MOD_EXPLOSIVE"
1438 && sMeansOfDeath !=
"MOD_PROJECTILE"
1439 && sMeansOfDeath !=
"MOD_PROJECTILE_SPLASH"
1440 && sMeansOfDeath !=
"MOD_BURNED"
1441 && sMeansOfDeath !=
"MOD_SUICIDE" )
1443 /# println(
"Exiting - damage type verbotten."); #/
1451 if(
IS_TRUE(level.pers_upgrade_insta_kill) )
1456 if( IsDefined(
self.overridePlayerDamage ) )
1458 iDamage =
self [[
self.overridePlayerDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime );
1460 else if( IsDefined( level.overridePlayerDamage ) )
1462 iDamage =
self [[level.overridePlayerDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime );
1465 Assert(IsDefined(iDamage),
"You must return a value from a damage override function.");
1472 maxHealth =
self.maxHealth;
1475 self.health += iDamage;
1478 self.maxHealth = maxHealth;
1484 if( isdefined(
self.divetoprone ) &&
self.divetoprone == 1 )
1487 if( sMeansOfDeath ==
"MOD_GRENADE_SPLASH" )
1490 dist = Distance2d(vPoint,
self.origin);
1494 dot_product = vectordot( AnglesToForward(
self.angles ), vDir );
1498 iDamage = int( iDamage * 0.5 );
1504 /# println(
"CB PD"); #/
1530 if ( isdefined( level.prevent_player_damage ) )
1532 if (
self [[ level.prevent_player_damage ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime ) )
1539 iDFlags = iDFlags | level.iDFLAGS_NO_KNOCKBACK;
1542 if( iDamage > 0 && sHitLoc ==
"riotshield" )
1544 sHitLoc =
"torso_upper";
1547 /# PrintLn(
"Finishplayerdamage wrapper."); #/
1549 if ( isPlayer(
self))
1555 if(IsDefined(eAttacker))
1557 Record3DText(
"D:" + iDamage +
" H: " +
self.health +
" A: " + eAttacker GetEntityNumber(),
self.origin,
RED,
"Script",
self );
1561 Record3DText(
"D:" + iDamage +
" H: " +
self.health +
" A: undefined",
self.origin,
RED,
"Script",
self );
1565 self finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, vSurfaceNormal );
1568 function finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, vSurfaceNormal )
1570 self finishPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, vSurfaceNormal );
1581 if (!isdefined(level.player_friendly_fire_callbacks))
1582 level.player_friendly_fire_callbacks = [];
1583 level.player_friendly_fire_callbacks[level.player_friendly_fire_callbacks.size] =
callback;
1586 function process_friendly_fire_callbacks( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, boneIndex )
1588 if (isdefined(level.player_friendly_fire_callbacks))
1590 foreach(
callback in level.player_friendly_fire_callbacks )
1592 self [[
callback]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, boneIndex );
1601 level
flag::init(
"start_encounters_match_logic" );
1612 level
flag::init(
"initial_blackscreen_passed" );
1617 power_trigs = GetEntArray(
"use_elec_switch",
"targetname" );
1618 foreach(trig
in power_trigs)
1620 if(IsDefined(trig.script_int))
1633 if (
IS_TRUE( level.use_water_risers ) )
1638 if (
IS_TRUE( level.use_foliage_risers ) )
1643 if (
IS_TRUE( level.use_low_gravity_risers ) )
1655 trigs = GetEntArray(
"use_elec_switch",
"targetname" );
1656 if ( IsDefined( trigs ) )
1658 bits = GetMinBitCountForNum( trigs.size + 1 );
1675 level._effect[
"fx_zombie_bar_break"] =
"_t6/maps/zombie/fx_zombie_bar_break";
1676 level._effect[
"fx_zombie_bar_break_lite"] =
"_t6/maps/zombie/fx_zombie_bar_break_lite";
1678 if ( !
IS_TRUE( level.FX_exclude_edge_fog ) )
1680 level._effect[
"edge_fog"] =
"_t6/maps/zombie/fx_fog_zombie_amb";
1683 level._effect[
"chest_light"] =
"zombie/fx_weapon_box_open_glow_zmb";
1684 level._effect[
"chest_light_closed"] =
"zombie/fx_weapon_box_closed_glow_zmb";
1686 if ( !
IS_TRUE( level.FX_exclude_default_eye_glow ) )
1688 level._effect[
"eye_glow"] =
"zombie/fx_glow_eye_orange";
1691 level._effect[
"headshot"] =
"zombie/fx_bul_flesh_head_fatal_zmb";
1692 level._effect[
"headshot_nochunks"] =
"zombie/fx_bul_flesh_head_nochunks_zmb";
1693 level._effect[
"bloodspurt"] =
"zombie/fx_bul_flesh_neck_spurt_zmb";
1695 if ( !
IS_TRUE( level.FX_exclude_tesla_head_light ) )
1697 level._effect[
"tesla_head_light"] =
"_t6/maps/zombie/fx_zombie_tesla_neck_spurt";
1699 level._effect[
"zombie_guts_explosion"] =
"zombie/fx_blood_torso_explo_lg_zmb";
1702 level._effect[
"rise_burst_water"] =
"zombie/fx_spawn_dirt_hand_burst_zmb";
1703 level._effect[
"rise_billow_water"] =
"zombie/fx_spawn_dirt_body_billowing_zmb";
1704 level._effect[
"rise_dust_water"] =
"zombie/fx_spawn_dirt_body_dustfalling_zmb";
1706 level._effect[
"rise_burst"] =
"zombie/fx_spawn_dirt_hand_burst_zmb";
1707 level._effect[
"rise_billow"] =
"zombie/fx_spawn_dirt_body_billowing_zmb";
1708 level._effect[
"rise_dust"] =
"zombie/fx_spawn_dirt_body_dustfalling_zmb";
1710 level._effect[
"fall_burst"] =
"zombie/fx_spawn_dirt_hand_burst_zmb";
1711 level._effect[
"fall_billow"] =
"zombie/fx_spawn_dirt_body_billowing_zmb";
1712 level._effect[
"fall_dust"] =
"zombie/fx_spawn_dirt_body_dustfalling_zmb";
1715 level._effect[
"character_fire_death_sm"] =
"zombie/fx_fire_torso_zmb";
1716 level._effect[
"character_fire_death_torso"] =
"zombie/fx_fire_torso_zmb";
1718 if ( !
IS_TRUE( level.fx_exclude_default_explosion ) )
1720 level._effect[
"def_explosion"] =
"_t6/explosions/fx_default_explosion";
1726 if ( !
IS_TRUE( level.disable_fx_upgrade_aquired ) )
1728 level._effect[
"upgrade_aquired"] =
"_t6/maps/zombie/fx_zmb_tanzit_upgrade";
1741 players = GetPlayers();
1742 level.players_playing = players.size;
1746 players = GetPlayers();
1747 level.players_playing = players.size;
1757 self SetClientCompass( 0 );
1758 self SetClientThirdPerson( 0 );
1760 self SetClientThirdPersonAngle( 0 );
1761 self SetClientUIVisibilityFlag(
"weapon_hud_visible", 1 );
1762 self SetClientMiniScoreboardHide( 1 );
1763 self SetClientHUDHardcore( 0 );
1764 self SetClientPlayerPushAmount( 1 );
1766 self SetDepthOfField( 0, 0, 512, 4000, 4, 0 );
1775 players = GetPlayers();
1777 for( i = 0; i < players.size; i++ )
1779 if(isDefined(excluded_player) && excluded_player == players[i])
1789 if( count==0 && !
IS_TRUE( level.no_end_game_check ) )
1791 level notify(
"end_game" );
1802 self endon(
"disconnect" );
1803 self notify(
"stop_onPlayerSpawned");
1804 self endon(
"stop_onPlayerSpawned");
1808 self waittill(
"spawned_player" );
1810 if(!
IS_TRUE(level.host_ended_game))
1812 self freezecontrols(
false );
1813 /# println(
" Unfreeze controls 7"); #/
1821 if( !
self HasWeapon( lethal_grenade ) )
1823 self GiveWeapon( lethal_grenade );
1824 self SetWeaponAmmoClip( lethal_grenade, 0 );
1827 self RecordPlayerReviveZombies(
self );
1830 if ( GetDvarInt(
"zombie_cheat" ) >= 1 && GetDvarInt(
"zombie_cheat" ) <= 3 )
1832 self EnableInvulnerability();
1836 self SetActionSlot( 3,
"altMode" );
1837 self PlayerKnockback(
false );
1839 self SetClientThirdPerson( 0 );
1841 self SetClientThirdPersonAngle( 0 );
1843 self SetDepthOfField( 0, 0, 512, 4000, 4, 0 );
1845 self cameraactivate(
false);
1848 self.on_lander_last_stand = undefined;
1849 self setblur(0, 0.1);
1850 self.zmbDialogQueue = [];
1851 self.zmbDialogActive =
false;
1852 self.zmbDialogGroups = [];
1853 self.zmbDialogGroup =
"";
1855 if (
IS_TRUE( level.player_out_of_playable_area_monitor ) )
1860 if (
IS_TRUE( level.player_too_many_weapons_monitor ) )
1862 self thread [[level.player_too_many_weapons_monitor_func]]();
1865 if (
IS_TRUE( level.player_too_many_players_check ) )
1867 level thread [[level.player_too_many_players_check_func]]();
1870 self.disabled_perks = [];
1872 if( isdefined(
self.player_initialized ) )
1874 if(
self.player_initialized ==
false )
1876 self.player_initialized =
true;
1882 self SetClientUIVisibilityFlag(
"weapon_hud_visible", 1 );
1883 self SetClientMiniScoreboardHide( 0 );
1885 self.is_drinking = 0;
1892 if(isDefined(level.custom_player_track_ammo_count))
1894 self thread [[level.custom_player_track_ammo_count]]();
1906 if(isDefined(level.zm_gamemodule_spawn_func))
1908 self thread [[level.zm_gamemodule_spawn_func]]();
1912 if(!isDefined(
self.lives))
1923 self endon(
"disconnect");
1936 life_brush =
spawn(
"trigger_radius", origin, 0, radius, height );
1937 life_brush.script_noteworthy =
"life_brush";
1945 life_brushes = getentarray(
"life_brush",
"script_noteworthy" );
1947 if ( !IsDefined( life_brushes ) )
1952 for ( i = 0; i < life_brushes.size; i++ )
1955 if (
self IsTouching( life_brushes[i] ) )
1967 kill_brush =
spawn(
"trigger_radius", origin, 0, radius, height );
1968 kill_brush.script_noteworthy =
"kill_brush";
1976 kill_brushes = getentarray(
"kill_brush",
"script_noteworthy" );
1978 self.kill_brush = undefined;
1980 if ( !IsDefined( kill_brushes ) )
1985 for ( i = 0; i < kill_brushes.size; i++ )
1988 if (
self IsTouching( kill_brushes[i] ) )
1990 self.kill_brush = kill_brushes[i];
2003 playable_area = getentarray(
"player_volume",
"script_noteworthy" );
2005 if( !IsDefined( playable_area ) )
2010 for ( i = 0; i < playable_area.size; i++ )
2025 if (
IS_TRUE( level.check_kill_thread_every_frame ) )
2037 self notify(
"stop_player_out_of_playable_area_monitor" );
2038 self endon(
"stop_player_out_of_playable_area_monitor" );
2039 self endon(
"disconnect" );
2040 level endon(
"end_game" );
2042 while(!isDefined(
self.characterindex))
2047 wait( (0.15 *
self.characterindex) );
2052 if (
self.sessionstate ==
"spectator" )
2058 if(
IS_TRUE(level.hostmigration_occured))
2066 if ( !isdefined( level.player_out_of_playable_area_monitor_callback ) ||
self [[level.player_out_of_playable_area_monitor_callback]]() )
2069 if (
IS_TRUE( level.kill_thread_test_mode ) )
2071 PrintTopRightln(
"out of playable area: " +
self.origin );
2076 if (
self isinmovemode(
"ufo",
"noclip" ) ||
IS_TRUE( level.disable_kill_thread ) || GetDvarInt(
"zombie_cheat" ) > 0 )
2088 self playlocalsound( level.zmb_laugh_alias );
2092 if ( GetPlayers().size == 1 && level
flag::get(
"solo_game" ) &&
IS_TRUE(
self.waiting_to_revive ) )
2094 level notify(
"end_game" );
2098 self DisableInvulnerability();
2100 self dodamage(
self.health + 1000,
self.origin );
2101 self.bleedout_time = 0;
2119 self endon(
"player_too_many_weapons_monitor_takeaway_sequence_done" );
2123 for ( i = 0; i < primary_weapons_to_take.size; i++ )
2125 self TakeWeapon( primary_weapons_to_take[i] );
2136 self.score_lost_when_downed = 0;
2139 self notify(
"player_too_many_weapons_monitor_takeaway_sequence_done" );
2147 self endon(
"player_downed" );
2148 self endon(
"replace_weapon_powerup" );
2153 for ( i = 0; i < primary_weapons_to_take.size; i++ )
2155 self playlocalsound( level.zmb_laugh_alias );
2156 self SwitchToWeapon( primary_weapons_to_take[i] );
2160 self TakeWeapon( primary_weapons_to_take[i] );
2163 self playlocalsound( level.zmb_laugh_alias );
2169 self notify(
"player_too_many_weapons_monitor_takeaway_sequence_done" );
2174 self notify(
"stop_player_too_many_weapons_monitor" );
2175 self endon(
"stop_player_too_many_weapons_monitor" );
2176 self endon(
"disconnect" );
2177 level endon(
"end_game" );
2180 scalar =
self.characterindex;
2182 if ( !isdefined( scalar ) )
2184 scalar =
self GetEntityNumber();
2187 wait( (0.15 * scalar) );
2198 if ( GetDvarInt(
"zombie_cheat" ) > 0 )
2207 primaryWeapons =
self GetWeaponsListPrimaries();
2209 if ( primaryWeapons.size > weapon_limit )
2212 primaryWeapons =
self GetWeaponsListPrimaries();
2215 primary_weapons_to_take = [];
2216 for ( i = 0; i < primaryWeapons.size; i++ )
2220 primary_weapons_to_take[primary_weapons_to_take.size] = primaryWeapons[i];
2224 if ( primary_weapons_to_take.size > weapon_limit )
2226 if ( !isdefined( level.player_too_many_weapons_monitor_callback ) ||
self [[level.player_too_many_weapons_monitor_callback]]( primary_weapons_to_take ) )
2235 self waittill(
"player_too_many_weapons_monitor_takeaway_sequence_done" );
2246 self endon(
"disconnect");
2247 self notify(
"stop_player_monitor_travel_dist");
2248 self endon(
"stop_player_monitor_travel_dist");
2250 prevpos =
self.origin;
2255 self.pers[
"distance_traveled"] += distance(
self.origin, prevpos ) ;
2256 prevpos =
self.origin;
2262 self endon(
"disconnect" );
2263 self notify(
"stop_player_monitor_time_played");
2264 self endon(
"stop_player_monitor_time_played");
2277 self endon(
"disconnect" );
2281 if ( !IsDefined( grenade ) )
2286 inflictorEntNum = grenade getEntityNumber();
2287 inflictorEntType = grenade getEntityType();
2288 inflictorBirthTime = 0;
2289 if ( isDefined( grenade.birthTime ) )
2290 inflictorBirthTime = grenade.birthTime;
2294 if ( !IsDefined(
self ) || (IsDefined( ret_val ) &&
"timeout" == ret_val) )
2299 self.grenade_multiattack_count = 0;
2300 self.grenade_multiattack_ent = undefined;
2301 self.grenade_multikill_count = 0;
2305 if ( !IsDefined(
self ) )
2310 count = level.grenade_multiattack_bookmark_count;
2311 if (
IS_TRUE( grenade.grenade_multiattack_bookmark_count ) )
2313 count = grenade.grenade_multiattack_bookmark_count;
2316 bookmark_string =
"zm_player_grenade_multiattack";
2317 if (
IS_TRUE( grenade.use_grenade_special_long_bookmark ) )
2319 bookmark_string =
"zm_player_grenade_special_long";
2321 else if (
IS_TRUE( grenade.use_grenade_special_bookmark ) )
2323 bookmark_string =
"zm_player_grenade_special";
2326 if ( count <=
self.grenade_multiattack_count && IsDefined(
self.grenade_multiattack_ent ) )
2328 addDemoBookmark( bookmark_string, gettime(),
self GetEntityNumber(), 255, 0, inflictorEntNum, inflictorEntType, inflictorBirthTime,
false,
self.grenade_multiattack_ent GetEntityNumber() );
2331 if ( 5 <=
self.grenade_multikill_count )
2336 self.grenade_multiattack_count = 0;
2337 self.grenade_multikill_count = 0;
2343 self endon(
"disconnect" );
2345 self notify(
"stop_player_grenade_watcher");
2346 self endon(
"stop_player_grenade_watcher");
2348 self.grenade_multiattack_count = 0;
2349 self.grenade_multikill_count = 0;
2353 self waittill(
"grenade_fire", grenade, weapon );
2355 if( isdefined( grenade ) && isalive( grenade ) )
2357 grenade.team =
self.team;
2362 if ( isdefined( level.grenade_watcher ) )
2364 self [[ level.grenade_watcher ]]( grenade, weapon );
2369 function player_prevent_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime )
2371 if( !isdefined( eInflictor ) || !isdefined( eAttacker ) )
2376 if ( eInflictor ==
self || eAttacker ==
self )
2381 if ( isdefined( eInflictor ) && isdefined( eInflictor.team ) )
2383 if (!
IS_TRUE(eInflictor.damage_own_team))
2384 if ( eInflictor.team ==
self.team )
2397 self endon(
"disconnect" );
2398 self notify(
"stop_player_revive_monitor");
2399 self endon(
"stop_player_revive_monitor");
2403 self waittill(
"player_revived", reviver );
2405 self playsoundtoplayer(
"zmb_character_revived",
self );
2407 if(
IS_TRUE(level.isresetting_grief))
2414 if ( IsDefined(reviver) )
2416 if( reviver !=
self )
2432 points =
self.score_lost_when_downed;
2434 if ( !isdefined( points ) )
2439 /# println(
"ZM >> LAST STAND - points = " + points); #/
2442 self.score_lost_when_downed = 0;
2444 if ( IsPlayer( reviver ) && reviver !=
self )
2458 if ( IsDefined(
self.laststand_perks ) )
2461 lost_perk_index = int( -1 );
2462 if(
self.laststand_perks.size > 1 )
2464 lost_perk_index = RandomInt(
self.laststand_perks.size-1 );
2468 for ( i=0; i<
self.laststand_perks.size; i++ )
2470 if (
self HasPerk(
self.laststand_perks[i] ) )
2474 if( i == lost_perk_index )
2486 self endon(
"death" );
2487 self endon(
"player_revived" );
2489 keep_checking =
true;
2490 while( keep_checking )
2492 self waittill(
"remote_revive", reviver );
2495 if( reviver.team ==
self.team )
2496 keep_checking =
false;
2502 function player_laststand( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
2504 /# println(
"ZM >> LAST STAND - player_laststand called" ); #/
2506 b_alt_visionset =
false;
2508 self AllowJump(
false);
2510 currWeapon =
self GetCurrentWeapon();
2512 self AddWeaponStat( currWeapon,
"deathsDuringUse", 1 );
2515 if(
IS_TRUE(
self.pers_upgrades_awarded[
"perk_lose"]) )
2520 players = GetPlayers();
2521 if ( players.size == 1 && level
flag::get(
"solo_game" ) )
2536 self DisableOffhandWeapons();
2540 if( sMeansOfDeath !=
"MOD_SUICIDE" && sMeansOfDeath !=
"MOD_FALLING" )
2546 if(isDefined(level.custom_player_death_vo_func) && !
self [[level.custom_player_death_vo_func]]() )
2553 if( IsDefined( level._zombie_minigun_powerup_last_stand_func ) )
2555 self thread [[level._zombie_minigun_powerup_last_stand_func]]();
2558 if( IsDefined( level._zombie_tesla_powerup_last_stand_func ) )
2560 self thread [[level._zombie_tesla_powerup_last_stand_func]]();
2565 b_alt_visionset =
true;
2567 if ( IsDefined( level.custom_laststand_func ) )
2569 self thread [[ level.custom_laststand_func ]]();
2580 level waittill(
"forever" );
2583 if ( !( b_alt_visionset ) )
2592 for ( i = 0; i < 10; i++ )
2596 players = GetPlayers();
2597 foreach(player
in players )
2606 iprintlnbold(
"FAILSAFE CLEANING UP REVIVE HUD AND GUN" );
2611 if ( isdefined( player.reviveProgressBar ) )
2616 if ( isdefined( player.reviveTextHud ) )
2628 if( points.size < 1 )
2632 points = array::randomize( points );
2636 SetDemoIntermissionPoint( point.origin, point.angles );
2642 self endon(
"disconnect" );
2643 self endon(
"spawned_spectator" );
2644 self notify(
"spawned" );
2645 self notify(
"end_respawn" );
2647 if( level.intermission )
2652 if( IsDefined( level.no_spectator ) && level.no_spectator )
2659 self.is_zombie =
true;
2665 self notify (
"zombified" );
2667 if( isdefined(
self.revivetrigger ) )
2669 self.revivetrigger
delete();
2670 self.revivetrigger = undefined;
2673 self.zombification_time = GetTime();
2678 self StopShellshock();
2679 self StopRumble(
"damage_heavy" );
2681 self.sessionstate =
"spectator";
2682 self.spectatorclient = -1;
2684 self.maxhealth =
self.health;
2685 self.shellshocked =
false;
2686 self.inWater =
false;
2687 self.friendlydamage = undefined;
2688 self.hasSpawned =
true;
2689 self.spawnTime = GetTime();
2692 /# println(
"*************************Zombie Spectator***" ); #/
2695 if( isdefined( level.custom_spectate_permissions ) )
2697 self [[level.custom_spectate_permissions]]();
2705 self Spawn(
self.origin,
self.angles );
2706 self notify(
"spawned_spectator" );
2711 self AllowSpectateTeam(
"allies", isOn &&
self.team ==
"allies" );
2712 self AllowSpectateTeam(
"axis", isOn &&
self.team ==
"axis" );
2713 self AllowSpectateTeam(
"freelook",
false );
2714 self AllowSpectateTeam(
"none",
false );
2719 self endon(
"disconnect" );
2720 self endon(
"spawned_player" );
2747 self endon(
"disconnect" );
2748 self endon(
"spawned_player" );
2750 third_person =
true;
2759 self SetClientThirdPerson( 1 );
2760 self SetClientThirdPersonAngle( 354 );
2762 self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
2766 self SetClientThirdPerson( 0 );
2767 self SetClientThirdPersonAngle( 0 );
2769 self setDepthOfField( 0, 0, 512, 4000, 4, 0 );
2776 level endon(
"between_round_over" );
2778 players = GetPlayers();
2782 laststand_count = 0;
2783 foreach(player
in players)
2791 if( laststand_count == players.size )
2793 for ( i = 0; i < players.size; i++ )
2806 level.pistol_values = [];
2810 level.pistol_values[ level.pistol_values.size ] = level.default_laststandpistol;
2811 level.pistol_values[ level.pistol_values.size ] = GetWeapon(
"pistol_burst" );
2812 level.pistol_values[ level.pistol_values.size ] = GetWeapon(
"pistol_fullauto" );
2813 level.pistol_value_solo_replace_below = level.pistol_values.size-1;
2814 level.pistol_values[ level.pistol_values.size ] = level.default_solo_laststandpistol;
2815 level.pistol_values[ level.pistol_values.size ] = GetWeapon(
"pistol_burst_upgraded" );
2816 level.pistol_values[ level.pistol_values.size ] = GetWeapon(
"pistol_fullauto_upgraded" );
2817 level.pistol_values[ level.pistol_values.size ] = GetWeapon(
"ray_gun" );
2818 level.pistol_values[ level.pistol_values.size ] = GetWeapon(
"raygun_mark2" );
2819 level.pistol_values[ level.pistol_values.size ] = GetWeapon(
"ray_gun_upgraded" );
2820 level.pistol_values[ level.pistol_values.size ] = GetWeapon(
"raygun_mark2_upgraded" );
2821 level.pistol_values[ level.pistol_values.size ] = GetWeapon(
"raygun_mark3" );
2822 level.pistol_values[ level.pistol_values.size ] = GetWeapon(
"raygun_mark3_upgraded" );
2830 self.lastActiveWeapon = level.weaponNone;
2834 if ( isdefined(
self.w_min_last_stand_pistol_override ) )
2839 if ( !
self HasWeapon(
self.laststandpistol ) )
2841 self GiveWeapon(
self.laststandpistol );
2843 ammoclip =
self.laststandpistol.clipSize;
2844 doubleclip = ammoclip * 2;
2846 if(
IS_TRUE(
self._special_solo_pistol_swap ) || (
self.laststandpistol == level.default_solo_laststandpistol && !
self.hadpistol) )
2848 self._special_solo_pistol_swap = 0;
2849 self.hadpistol =
false;
2850 self SetWeaponAmmoStock(
self.laststandpistol, doubleclip );
2852 else if( level
flag::get(
"solo_game") &&
self.laststandpistol == level.default_solo_laststandpistol )
2854 self SetWeaponAmmoStock(
self.laststandpistol, doubleclip );
2856 else if (
self.laststandpistol == level.default_laststandpistol )
2858 self SetWeaponAmmoStock(
self.laststandpistol, doubleclip );
2860 else if ( !isdefined(
self.stored_weapon_info ) || !isdefined(
self.stored_weapon_info[
self.laststandpistol ] ) )
2862 self SetWeaponAmmoStock(
self.laststandpistol, doubleclip );
2864 else if (
self.laststandpistol.name ==
"ray_gun" ||
self.laststandpistol.name ==
"ray_gun_upgraded" )
2866 if (
self.stored_weapon_info[
self.laststandpistol ].total_amt >= ammoclip )
2868 self SetWeaponAmmoClip(
self.laststandpistol, ammoclip );
2869 self.stored_weapon_info[
self.laststandpistol ].given_amt = ammoclip;
2873 self SetWeaponAmmoClip(
self.laststandpistol,
self.stored_weapon_info[
self.laststandpistol ].total_amt );
2874 self.stored_weapon_info[
self.laststandpistol ].given_amt =
self.stored_weapon_info[
self.laststandpistol ].total_amt;
2876 self SetWeaponAmmoStock(
self.laststandpistol, 0 );
2880 if (
self.stored_weapon_info[
self.laststandpistol ].stock_amt >= doubleclip )
2882 self SetWeaponAmmoStock(
self.laststandpistol, doubleclip );
2883 self.stored_weapon_info[
self.laststandpistol ].given_amt = doubleclip +
self.stored_weapon_info[
self.laststandpistol ].clip_amt +
self.stored_weapon_info[
self.laststandpistol ].left_clip_amt;
2887 self SetWeaponAmmoStock(
self.laststandpistol,
self.stored_weapon_info[
self.laststandpistol ].stock_amt );
2888 self.stored_weapon_info[
self.laststandpistol ].given_amt =
self.stored_weapon_info[
self.laststandpistol ].total_amt;
2892 self SwitchToWeapon(
self.laststandpistol );
2898 for( i = 0; i < level.pistol_values.size; i++ )
2900 if( level.pistol_values[i] ==
self.w_min_last_stand_pistol_override )
2902 n_min_last_stand_pistol_value = i;
2907 for( k = 0; k < level.pistol_values.size; k++ )
2909 if( level.pistol_values[k] ==
self.laststandpistol )
2911 n_default_last_stand_pistol_value = k;
2916 if ( n_min_last_stand_pistol_value > n_default_last_stand_pistol_value )
2918 self.hadpistol =
false;
2919 self.laststandpistol =
self.w_min_last_stand_pistol_override;
2928 current_weapons =
self GetWeaponsListPrimaries();
2930 for( i = 0; i < current_weapons.size; i++ )
2933 wclass = current_weapons[i].weapClass;
2934 if ( current_weapons[i].isBallisticKnife )
2939 if ( wclass ==
"pistol" || wclass ==
"pistolspread" || wclass ==
"pistol spread" )
2941 if ( (current_weapons[i] != level.default_solo_laststandpistol && !level
flag::get(
"solo_game") ) || (!level
flag::get(
"solo_game") && current_weapons[i] != level.default_solo_laststandpistol ))
2943 if( (current_weapons[i] !=
self.laststandpistol) || (
self.laststandpistol != level.default_laststandpistol) )
2945 if (
self GetAmmoCount( current_weapons[i] ) <= 0 )
2952 pistol_array_index = pistol_array.size;
2953 pistol_array[ pistol_array_index ] = SpawnStruct();
2955 pistol_array[ pistol_array_index ].weapon = current_weapons[i];
2956 pistol_array[ pistol_array_index ].value = 0;
2959 for( j = 0; j < level.pistol_values.size; j++ )
2961 if( level.pistol_values[j] == current_weapons[i].rootWeapon )
2963 pistol_array[ pistol_array_index ].value = j;
2976 if( !IsArray( struct_array ) || struct_array.size <= 0 )
2978 self.hadpistol =
false;
2981 if(isDefined(
self.stored_weapon_info))
2983 stored_weapon_info = GetArrayKeys(
self.stored_weapon_info );
2984 for( j = 0; j < stored_weapon_info.size; j++ )
2986 if( stored_weapon_info[ j ].rootWeapon == level.laststandpistol)
2988 self.hadpistol =
true;
2989 return stored_weapon_info[ j ];
2994 return level.laststandpistol;
2997 highest_score_pistol = struct_array[0];
2999 for( i = 1; i < struct_array.size; i++ )
3001 if( struct_array[i].value > highest_score_pistol.value )
3003 highest_score_pistol = struct_array[i];
3009 self._special_solo_pistol_swap = 0;
3010 if( highest_score_pistol.value <= level.pistol_value_solo_replace_below )
3012 self.hadpistol =
false;
3013 self._special_solo_pistol_swap = 1;
3017 return highest_score_pistol.weapon;
3021 return level.laststandpistol;
3026 return highest_score_pistol.weapon;
3031 return highest_score_pistol.weapon;
3039 weapon_inventory =
self GetWeaponsList(
true );
3040 self.stored_weapon_info = [];
3042 for( i = 0; i < weapon_inventory.size; i++ )
3044 weapon = weapon_inventory[i];
3046 wclass = weapon.weapClass;
3047 if ( weapon.isBallisticKnife )
3052 if ( wclass ==
"pistol" || wclass ==
"pistolspread" || wclass ==
"pistol spread" )
3054 self.stored_weapon_info[ weapon ] = SpawnStruct();
3055 self.stored_weapon_info[ weapon ].clip_amt =
self GetWeaponAmmoClip( weapon );
3056 self.stored_weapon_info[ weapon ].left_clip_amt = 0;
3057 dual_wield_weapon = weapon.dualWieldWeapon;
3058 if ( level.weaponNone != dual_wield_weapon )
3060 self.stored_weapon_info[ weapon ].left_clip_amt =
self GetWeaponAmmoClip( dual_wield_weapon );
3062 self.stored_weapon_info[ weapon ].stock_amt =
self GetWeaponAmmoStock( weapon );
3063 self.stored_weapon_info[ weapon ].total_amt =
self.stored_weapon_info[ weapon ].clip_amt +
self.stored_weapon_info[ weapon ].left_clip_amt +
self.stored_weapon_info[ weapon ].stock_amt;
3064 self.stored_weapon_info[ weapon ].given_amt = 0;
3074 self.weapon_taken_by_losing_specialty_additionalprimaryweapon = level.weaponNone;
3076 if ( !IsDefined(
self.stored_weapon_info ) )
3081 weapon_inventory =
self GetWeaponsList(
true );
3082 weapon_to_restore = GetArrayKeys(
self.stored_weapon_info );
3084 for( i = 0; i < weapon_inventory.size; i++ )
3086 weapon = weapon_inventory[i];
3088 if ( weapon !=
self.laststandpistol )
3094 for( j = 0; j < weapon_to_restore.size; j++ )
3096 if ( weapon == weapon_to_restore[j] )
3098 dual_wield_weapon = weapon_to_restore[j].dualWieldWeapon;
3099 if ( weapon != level.default_laststandpistol )
3101 last_clip =
self GetWeaponAmmoClip( weapon );
3103 if ( level.weaponNone != dual_wield_weapon )
3105 last_left_clip =
self GetWeaponAmmoClip( dual_wield_weapon );
3107 last_stock =
self GetWeaponAmmoStock( weapon );
3108 last_total = last_clip + last_left_clip + last_stock;
3110 used_amt =
self.stored_weapon_info[ weapon ].given_amt - last_total;
3112 if ( used_amt >=
self.stored_weapon_info[ weapon ].stock_amt )
3114 used_amt -=
self.stored_weapon_info[ weapon ].stock_amt;
3115 self.stored_weapon_info[ weapon ].stock_amt = 0;
3117 self.stored_weapon_info[ weapon ].clip_amt -= used_amt;
3118 if (
self.stored_weapon_info[ weapon ].clip_amt < 0 )
3120 self.stored_weapon_info[ weapon ].clip_amt = 0;
3125 new_stock_amt =
self.stored_weapon_info[ weapon ].stock_amt - used_amt;
3126 if ( new_stock_amt <
self.stored_weapon_info[ weapon ].stock_amt )
3128 self.stored_weapon_info[ weapon ].stock_amt = new_stock_amt;
3133 self SetWeaponAmmoClip( weapon,
self.stored_weapon_info[weapon].clip_amt );
3134 if ( level.weaponNone != dual_wield_weapon )
3136 self SetWeaponAmmoClip( dual_wield_weapon,
self.stored_weapon_info[weapon].left_clip_amt );
3138 self SetWeaponAmmoStock( weapon,
self.stored_weapon_info[weapon].stock_amt );
3147 self endon(
"disconnect" );
3148 self endon(
"bled_out" );
3149 self endon(
"player_revived" );
3151 self waittill (
"grenade_fire", grenade, weapon );
3153 if ( isdefined(
self.lsgsar_lethal) && weapon ==
self.lsgsar_lethal )
3155 self.lsgsar_lethal_nade_amt--;
3158 if ( isdefined(
self.lsgsar_tactical) && weapon ==
self.lsgsar_tactical )
3160 self.lsgsar_tactical_nade_amt--;
3167 if(
IS_TRUE(level.isresetting_grief))
3171 self endon(
"disconnect" );
3172 self endon (
"bled_out");
3174 self.lsgsar_lethal_nade_amt = 0;
3175 self.lsgsar_has_lethal_nade =
false;
3176 self.lsgsar_tactical_nade_amt = 0;
3177 self.lsgsar_has_tactical_nade =
false;
3178 self.lsgsar_lethal = undefined;
3179 self.lsgsar_tactical = undefined;
3181 if (
self IsThrowingGrenade())
3187 if ( weapon != level.weaponNone )
3189 self.lsgsar_has_lethal_nade =
true;
3190 self.lsgsar_lethal = weapon;
3191 self.lsgsar_lethal_nade_amt =
self GetWeaponAmmoClip( weapon );
3192 self SetWeaponAmmoClip( weapon, 0 );
3193 self TakeWeapon( weapon );
3197 if ( weapon != level.weaponNone )
3199 self.lsgsar_has_tactical_nade =
true;
3200 self.lsgsar_tactical = weapon;
3201 self.lsgsar_tactical_nade_amt =
self GetWeaponAmmoClip( weapon );
3202 self SetWeaponAmmoClip( weapon, 0 );
3203 self TakeWeapon( weapon );
3206 self waittill(
"player_revived" );
3208 if (
self.lsgsar_has_lethal_nade )
3211 self GiveWeapon(
self.lsgsar_lethal );
3212 self SetWeaponAmmoClip(
self.lsgsar_lethal,
self.lsgsar_lethal_nade_amt );
3215 if (
self.lsgsar_has_tactical_nade )
3218 self GiveWeapon(
self.lsgsar_tactical );
3219 self SetWeaponAmmoClip(
self.lsgsar_tactical,
self.lsgsar_tactical_nade_amt );
3222 self.lsgsar_lethal_nade_amt = undefined;
3223 self.lsgsar_has_lethal_nade = undefined;
3224 self.lsgsar_tactical_nade_amt = undefined;
3225 self.lsgsar_has_tactical_nade = undefined;
3226 self.lsgsar_lethal = undefined;
3227 self.lsgsar_tactical = undefined;
3233 level endon(
"between_round_over" );
3235 if( !IsDefined( level.zombie_vars[
"spectators_respawn"] ) || !level.zombie_vars[
"spectators_respawn"] )
3242 players = GetPlayers();
3243 for( i = 0; i < players.size; i++ )
3245 e_player = players[i];
3257 if( !IsDefined( level.custom_spawnPlayer ) )
3263 self [[level.spawnPlayer]]();
3265 if (isDefined(level.script) && level.round_number > 6 &&
self.score < 1500)
3267 self.old_score =
self.score;
3268 if(isDefined(level.spectator_respawn_custom_score))
3270 self [[level.spectator_respawn_custom_score]]();
3279 /# println(
"*************************Respawn Spectator***" ); #/
3282 origin =
self.spectator_respawn.origin;
3283 angles =
self.spectator_respawn.angles;
3287 new_origin = undefined;
3290 if ( isdefined( level.check_valid_spawn_override ) )
3292 new_origin = [[ level.check_valid_spawn_override ]]( self );
3295 if ( !isdefined( new_origin ) )
3301 if( IsDefined( new_origin ) )
3303 if(!isDefined(new_origin.angles))
3309 angles = new_origin.angles;
3311 self Spawn( new_origin.origin, angles );
3315 self Spawn( origin, angles );
3327 self.is_burning = undefined;
3328 self.abilities = [];
3331 self.is_zombie =
false;
3335 self RevivePlayer();
3337 self notify(
"spawned_player" );
3340 if(IsDefined(level._zombiemode_post_respawn_callback))
3342 self thread [[level._zombiemode_post_respawn_callback]]();
3364 if ( IsDefined( level.check_for_valid_spawn_near_team_callback ) )
3366 spawn_location = [[ level.check_for_valid_spawn_near_team_callback ]](revivee, return_struct);
3367 return spawn_location;
3371 players = GetPlayers();
3374 closest_group = undefined;
3375 closest_distance = 100000000;
3376 backup_group = undefined;
3377 backup_distance = 100000000;
3379 if( spawn_points.size == 0 )
3386 for( i = 0; i < players.size; i++ )
3390 for( j = 0 ; j < spawn_points.size; j++ )
3392 if( isdefined(spawn_points[j].script_int) )
3393 ideal_distance = spawn_points[j].script_int;
3395 ideal_distance = 1000;
3404 if ( spawn_points[j].locked ==
false )
3406 plyr_dist = DistanceSquared( players[i].origin, spawn_points[j].origin );
3407 if( plyr_dist < ( ideal_distance * ideal_distance ) )
3409 if ( plyr_dist < closest_distance )
3411 closest_distance = plyr_dist;
3417 if ( plyr_dist < backup_distance )
3420 backup_distance = plyr_dist;
3428 if( !IsDefined( closest_group ) )
3430 closest_group = backup_group;
3433 if( IsDefined( closest_group ) )
3436 if( IsDefined(spawn_location) )
3438 return( spawn_location );
3454 spawn_array = array::randomize(spawn_array);
3456 for( k = 0; k < spawn_array.size; k++ )
3458 if(IsDefined(spawn_array[k].plyr) && spawn_array[k].plyr == revivee GetEntityNumber())
3460 if(positionWouldTelefrag(spawn_array[k].origin))
3462 spawn_array[k].plyr = undefined;
3467 return spawn_array[k];
3471 return spawn_array[k].origin;
3476 for( k = 0; k < spawn_array.size; k++ )
3478 if(positionWouldTelefrag(spawn_array[k].origin))
3482 if(!IsDefined(spawn_array[k].plyr) || spawn_array[k].plyr == revivee GetEntityNumber())
3484 spawn_array[k].plyr = revivee GetEntityNumber();
3487 return spawn_array[k];
3491 return spawn_array[k].origin;
3498 return spawn_array[0];
3501 return spawn_array[0].origin;
3512 if( spawn_points.size == 0 )
3514 return( undefined );
3517 closest_group = undefined;
3518 closest_distance = 100000000;
3519 backup_group = undefined;
3520 backup_distance = 100000000;
3522 for( i=0 ; i<spawn_points.size; i++ )
3524 if( IsDefined(spawn_points[i].script_int) )
3526 ideal_distance = spawn_points[i].script_int;
3530 ideal_distance = 1000;
3533 if ( spawn_points[i].locked ==
false )
3535 dist = DistanceSquared( v_position, spawn_points[i].origin );
3536 if( dist < ( ideal_distance * ideal_distance ) )
3538 if ( dist < closest_distance )
3540 closest_distance = dist;
3546 if ( dist < backup_distance )
3549 backup_distance = dist;
3554 if ( !IsDefined( closest_group ) )
3556 closest_group = backup_group;
3560 if( IsDefined( closest_group ) )
3563 if( IsDefined(spawn_location) )
3565 return( spawn_location );
3582 if( spawn_points.size == 0 )
3584 return( undefined );
3587 closest_group = undefined;
3588 closest_distance = 100000000;
3590 for( i=0 ; i<spawn_points.size; i++ )
3592 if ( spawn_points[i].locked ==
false )
3594 dist = Distance( v_position, spawn_points[i].origin );
3595 if( (dist >= min_distance) && (dist <= max_distance) )
3597 if( dist < closest_distance )
3599 closest_distance = dist;
3606 if( IsDefined( closest_group ) )
3609 if( IsDefined(spawn_location) )
3611 return( spawn_location );
3626 players = GetPlayers();
3627 for(i=0;i<players.size;i++)
3630 if(players[i].spawn_side ==
self.spawn_side && !isDefined(players[i].revivetrigger) && players[i] != exclude )
3632 teammates[teammates.size] = players[i];
3643 players = GetPlayers();
3646 min_dist = 150 * 150;
3647 for( i = 0; i < players.size; i++ )
3654 valid_players[valid_players.size] = players[i];
3657 for( i = 0; i < valid_players.size; i++ )
3660 for( q = 1; q < player.zombie_breadcrumbs.size; q++ )
3662 if( DistanceSquared( player.zombie_breadcrumbs[q], valid_players[i].origin ) < min_dist )
3668 if( count == valid_players.size )
3670 return player.zombie_breadcrumbs[q];
3680 level endon(
"intermission" );
3681 level endon(
"end_of_round" );
3682 level endon(
"restart_round" );
3684 level endon(
"kill_round" );
3687 if( level.intermission )
3697 if( level.zm_loc_types[
"zombie_location" ].size < 1 )
3699 ASSERTMSG(
"No active spawners in the map. Check to see if the zone is active and if it's pointing to spawners." );
3708 players = GetPlayers();
3709 for( i = 0; i < players.size; i++ )
3711 players[i].zombification_time = 0;
3715 if ( !( IsDefined( level.kill_counter_hud ) && level.zombie_total > 0 ) )
3718 level.zombie_respawns = 0;
3719 level notify(
"zombie_total_set" );
3722 if ( IsDefined( level.zombie_total_set_func ) )
3724 level thread [[ level.zombie_total_set_func ]]();
3727 if ( level.round_number < 10 || level.speed_change_max > 0 )
3732 old_spawn = undefined;
3756 while( level.zm_loc_types[
"zombie_location" ].size <= 0 )
3763 if (
IS_TRUE(level.hostMigrationTimer) )
3770 if ( isdefined( level.fn_custom_round_ai_spawn ) )
3772 if ( [[ level.fn_custom_round_ai_spawn ]]() )
3780 if( IsDefined( level.zombie_spawners ) )
3783 if ( isdefined( level.fn_custom_zombie_spawner_selection ) )
3785 spawner = [[ level.fn_custom_zombie_spawner_selection ]]();
3791 if(
IS_TRUE( level.use_multiple_spawns ) )
3793 if( isdefined( level.spawner_int ) &&
IS_TRUE( level.zombie_spawn[level.spawner_int].size ) )
3795 spawner = array::random( level.zombie_spawn[level.spawner_int] );
3799 spawner = array::random( level.zombie_spawners );
3804 spawner = array::random( level.zombie_spawners );
3811 if( IsDefined( ai ) )
3813 level.zombie_total--;
3814 if ( level.zombie_respawns > 0 )
3816 level.zombie_respawns--;
3828 if ( level.zombie_respawns > 0 )
3834 wait( level.zombie_vars[
"zombie_spawn_delay"] );
3844 max = level.zombie_vars[
"zombie_max_ai"];
3846 multiplier = n_round / 5;
3847 if( multiplier < 1 )
3855 multiplier *= n_round * 0.15;
3858 if( n_player_count == 1 )
3860 max += int( ( 0.5 * level.zombie_vars[
"zombie_ai_per_player"] ) * multiplier );
3864 max += int( ( ( n_player_count - 1 ) * level.zombie_vars[
"zombie_ai_per_player"] ) * multiplier );
3867 if( !isDefined( level.max_zombie_func ) )
3872 n_zombie_count = [[ level.max_zombie_func ]]( max, n_round );
3874 return n_zombie_count;
3880 foreach ( str_id, s
in level.custom_ai_spawn_check_funcs )
3882 if ( [[ s.func_check ]]() )
3884 a_spawners = [[ s.func_get_spawners ]]();
3885 level.zombie_spawners = ArrayCombine( level.zombie_spawners, a_spawners,
false,
false );
3887 if (
IS_TRUE( level.use_multiple_spawns ) )
3889 foreach ( sp
in a_spawners )
3891 if ( IsDefined( sp.script_int ) )
3893 if ( !IsDefined( level.zombie_spawn[ sp.script_int ] ) )
3895 level.zombie_spawn[ sp.script_int ] = [];
3898 if ( !IsInArray( level.zombie_spawn[ sp.script_int ], sp ) )
3900 ARRAY_ADD( level.zombie_spawn[ sp.script_int ], sp );
3906 if ( IsDefined( s.func_get_locations ) )
3908 a_locations = [[ s.func_get_locations ]]();
3909 level.zm_loc_types[
"zombie_location" ] = ArrayCombine( level.zm_loc_types[
"zombie_location" ], a_locations,
false,
false );
3914 a_spawners = [[ s.func_get_spawners ]]();
3916 foreach ( sp
in a_spawners )
3918 ArrayRemoveValue( level.zombie_spawners, sp );
3921 if (
IS_TRUE( level.use_multiple_spawns ) )
3923 foreach ( sp
in a_spawners )
3925 if ( IsDefined( sp.script_int ) && IsDefined( level.zombie_spawn[ sp.script_int ] ) )
3927 ArrayRemoveValue( level.zombie_spawn[ sp.script_int ], sp );
3932 if ( IsDefined( s.func_get_locations ) )
3934 a_locations = [[ s.func_get_locations ]]();
3936 foreach ( s_loc
in a_locations )
3938 ArrayRemoveValue( level.zm_loc_types[
"zombie_location" ], s_loc );
3947 if ( !IsDefined( level.custom_ai_spawn_check_funcs[str_id] ) )
3949 level.custom_ai_spawn_check_funcs[ str_id ] = SpawnStruct();
3952 level.custom_ai_spawn_check_funcs[ str_id ].func_check = func_check;
3953 level.custom_ai_spawn_check_funcs[ str_id ].func_get_spawners = func_get_spawners;
3954 level.custom_ai_spawn_check_funcs[ str_id ].func_get_locations = func_get_locations;
3962 spawn_point = array::random( level.zm_loc_types[
"zombie_location" ] );
3964 spawner = array::random(level.zombie_spawners);
3967 ai waittill(
"death");
4030 if ( !IsDefined(
delay ) )
4036 level.countdown_hud SetValue(
delay );
4037 level.countdown_hud.color = ( 1, 1, 1 );
4038 level.countdown_hud.alpha = 1;
4039 level.countdown_hud FadeOverTime( 2.0 );
4042 level.countdown_hud.color = ( 0.21, 0, 0 );
4043 level.countdown_hud FadeOverTime( 3.0 );
4050 level.countdown_hud SetValue(
delay );
4054 players = GetPlayers();
4055 for (i=0; i<players.size; i++ )
4057 players[i] playlocalsound(
"zmb_perks_packa_ready" );
4060 level.countdown_hud FadeOverTime( 1.0 );
4061 level.countdown_hud.color = (1,1,1);
4062 level.countdown_hud.alpha = 0;
4073 if ( !isdefined( level.zombie_spawners) || level.zombie_spawners.size == 0 )
4075 /#PrintLn(
"***Warning: No spawners found for this level.***");#/
4079 /# PrintLn(
"ZM >> round_start start" ); #/
4081 if ( IsDefined(level.round_prestart_func) )
4083 [[ level.round_prestart_func ]]();
4089 if ( IsDefined( level.zombie_round_start_delay ) )
4091 n_delay = level.zombie_round_start_delay;
4097 level.zombie_health = level.zombie_vars[
"zombie_health_start"];
4099 if( GetDvarInt(
"scr_writeconfigstrings" ) == 1 )
4106 if ( level.zombie_vars[
"game_start_delay"] > 0 )
4113 if( !isDefined(level.round_spawn_func) )
4118 if(!IsDefined(level.move_spawn_func))
4124 if (GetDvarInt(
"zombie_rise_test") )
4130 if ( !isDefined(level.round_wait_func) )
4135 if ( !IsDefined(level.round_think_func) )
4141 level thread [[ level.round_think_func ]]();
4148 self endon (
"warning_dialog");
4154 players = GetPlayers();
4155 for(i = 0; i < players.size; i++)
4157 dist = distancesquared(players[i].origin,
self.origin );
4163 while(dist < 70*70 &&
timer < 3)
4168 if(dist > 70*70 &&
timer >= 3)
4170 self playsound(
"door_deny");
4174 self notify (
"warning_dialog");
4183 players = GetPlayers();
4184 if( !IsDefined( players[0] ) )
4186 level waittill(
"first_player_ready" );
4194 level endon(
"end_game");
4195 if( isdefined(level.noRoundNumber) && level.noRoundNumber==
true )
4200 if(!IsDefined(level.doground_nomusic))
4202 level.doground_nomusic = 0;
4205 if( level.first_round )
4208 if( isdefined( level._custom_intro_vox ) )
4210 level thread [[level._custom_intro_vox]]();
4223 if( level.round_number == 5 || level.round_number == 10 || level.round_number == 20 || level.round_number == 35 || level.round_number == 50 )
4225 players = GetPlayers();
4226 rand = RandomIntRange(0,players.size);
4232 if(
IS_TRUE(level.host_ended_game))
4238 level notify(
"intro_hud_done" );
4247 ReportMTU(level.round_number);
4255 if( isdefined(level.noRoundNumber) && level.noRoundNumber==
true )
4260 time = [[level.func_get_delay_between_rounds]]();
4262 players = GetPlayers();
4263 for ( player_index = 0; player_index < players.size; player_index++ )
4265 if ( !IsDefined( players[player_index].pers[
"previous_distance_traveled"] ) )
4267 players[player_index].pers[
"previous_distance_traveled"] = 0;
4269 distanceThisRound = int( players[player_index].pers[
"distance_traveled"] - players[player_index].pers[
"previous_distance_traveled"] );
4270 players[player_index].pers[
"previous_distance_traveled"] = players[player_index].pers[
"distance_traveled"];
4271 players[player_index] IncrementPlayerStat(
"distance_traveled", distanceThisRound );
4272 if ( players[player_index].pers[
"team"] !=
"spectator" )
4277 RecordZombieRoundEnd();
4284 return( level.zombie_vars[
"zombie_between_round_time"] );
4289 if (isDefined(weapon))
4291 weaponIdx = GetBaseWeaponItemIndex(weapon);
4292 if (isDefined(weaponIdx))
4294 self incrementplayerstat(statname, weaponIdx);
4301 current_weapons =
self GetWeaponsListPrimaries();
4302 for (index = 0; index < max_weapons && index < current_weapons.size; index++)
4311 if( IsDefined(zoneName) )
4313 self RecordZombieZone(
"startingZone", zoneName);
4316 self incrementplayerstat(
"score",
self.score);
4317 primaryWeapon =
self GetCurrentWeapon();
4326 if( IsDefined(zoneName) )
4328 self RecordZombieZone(
"endingZone", zoneName );
4337 /# PrintLn(
"ZM >> round_think start" ); #/
4339 level endon(
"end_round_think");
4344 if ( IsDefined( level.initial_round_wait_func ))
4345 [[level.initial_round_wait_func]]();
4347 if(!
IS_TRUE(level.host_ended_game))
4350 players = GetPlayers();
4351 foreach(player
in players)
4353 if(!
IS_TRUE(player.hostMigrationControlsFrozen))
4355 player FreezeControls(
false);
4356 /# println(
" Unfreeze controls 8"); #/
4365 SetRoundsPlayed( level.round_number );
4371 maxreward = 50 * level.round_number;
4372 if ( maxreward > 500 )
4374 level.zombie_vars[
"rebuild_barrier_cap_per_round"] = maxreward;
4377 level.pro_tips_start_time = GetTime();
4378 level.zombie_last_run_time = GetTime();
4380 if ( IsDefined( level.zombie_round_change_custom ) )
4382 [[ level.zombie_round_change_custom ]]();
4386 if( !
IS_TRUE( level.sndMusicSpecialRound ) )
4388 if(
IS_TRUE(level.sndGotoRoundOccurred))
4389 level.sndGotoRoundOccurred =
false;
4390 else if( level.round_number == 1 )
4392 else if( level.round_number <= 5 )
4403 players = GetPlayers();
4406 if(!
IS_TRUE(level.headshots_only) && !restart )
4411 /# PrintLn(
"ZM >> round_think, round="+level.round_number+
", player_count=" + players.size ); #/
4413 level.round_start_time = GetTime();
4416 while( level.zm_loc_types[
"zombie_location" ].size <= 0 )
4423 zkeys = GetArrayKeys( level.zones );
4424 for ( i = 0; i < zkeys.size; i++ )
4426 zoneName = zkeys[i];
4427 level.zones[zoneName].round_spawn_count = 0;
4431 level thread [[level.round_spawn_func]]();
4433 level notify(
"start_of_round" );
4434 RecordZombieRoundStart();
4436 players = GetPlayers();
4437 for ( index = 0; index < players.size; index++ )
4441 if(isDefined(level.round_start_custom_func))
4443 [[level.round_start_custom_func]]();
4446 [[level.round_wait_func]]();
4448 level.first_round =
false;
4449 level notify(
"end_of_round" );
4453 if(isDefined(level.round_end_custom_logic))
4455 [[level.round_end_custom_logic]]();
4458 players = GetPlayers();
4464 if(
IS_TRUE(level.no_end_game_check) )
4469 else if ( 1 != players.size )
4475 players = GetPlayers();
4478 if (
int(level.round_number / 5) * 5 == level.round_number )
4480 level
clientfield::set(
"round_complete_time",
int( ( level.time - level.n_gameplay_start_time + 500 ) / 1000 ) );
4488 if( level.gamedifficulty == 0 )
4490 level.zombie_move_speed = level.round_number * level.zombie_vars[
"zombie_move_speed_multiplier_easy"];
4494 level.zombie_move_speed = level.round_number * level.zombie_vars[
"zombie_move_speed_multiplier"];
4502 level.zombie_vars[
"zombie_spawn_delay"] = [[level.func_get_zombie_spawn_delay]](
get_round_number() );
4506 matchUTCTime = GetUTC();
4508 players = GetPlayers();
4509 foreach(player
in players)
4511 if ( level.curr_gametype_affects_rank &&
get_round_number() > (3 + level.start_round) )
4524 for ( i = 0; i < 4; i++ )
4526 player.number_revives_per_round[i] = 0;
4529 if ( IsAlive( player ) && player.sessionstate !=
"spectator" && !
IS_TRUE( level.skip_alive_at_round_end_xp ) )
4534 if ( score_number < 1 )
4538 else if ( score_number > 20 )
4546 if( isdefined( level.check_quickrevive_hotjoin ) )
4548 [[ level.check_quickrevive_hotjoin ]]();
4555 level notify(
"between_round_over" );
4557 level.skip_alive_at_round_end_xp =
false;
4566 players = GetPlayers();
4568 for (i = 0; i < players.size; i++)
4573 if( !players[i] HasWeapon( lethal_grenade ) )
4575 players[i] GiveWeapon( lethal_grenade );
4576 players[i] SetWeaponAmmoClip( lethal_grenade, 0 );
4579 frac = players[i] GetFractionMaxAmmo( lethal_grenade );
4582 players[i] SetWeaponAmmoClip( lethal_grenade, 2 );
4584 else if ( frac < .5 )
4586 players[i] SetWeaponAmmoClip( lethal_grenade, 3 );
4590 players[i] SetWeaponAmmoClip( lethal_grenade, 4 );
4606 n_multiplier = 0.95;
4608 switch( level.players.size )
4624 for( i=1; i<n_round; i++ )
4626 n_delay *= n_multiplier;
4628 if ( n_delay <= 0.1 )
4642 level notify(
"failsafe_debug_stop" );
4643 level endon(
"failsafe_debug_stop" );
4646 level.chunk_time = 0;
4650 level.failsafe_time = GetTime() - start;
4652 if ( isdefined(
self.lastchunk_destroy_time ) )
4654 level.chunk_time = GetTime() -
self.lastchunk_destroy_time;
4666 if( GetDvarInt(
"zombiemode_debug_zombie_count") )
4668 if( !isdefined( level.debug_zombie_count_hud ) )
4670 level.debug_zombie_count_hud= NewDebugHudElem();
4671 level.debug_zombie_count_hud.alignX =
"right";
4672 level.debug_zombie_count_hud.x = 100;
4673 level.debug_zombie_count_hud.y = 10;
4674 level.debug_zombie_count_hud SetText(
"COUNTS" );
4678 number_to_kill = level.zombie_total;
4679 level.debug_zombie_count_hud SetText(
"ALIVE=" + currentCount +
" / TOGO=" + number_to_kill );
4684 if( isdefined( level.debug_zombie_count_hud ) )
4686 level.debug_zombie_count_hud Destroy();
4687 level.debug_zombie_count_hud = undefined;
4700 level endon(
"restart_round");
4702 level endon(
"kill_round" );
4706 if (GetDvarInt(
"zombie_rise_test") )
4708 level waittill(
"forever");
4714 level waittill(
"forever");
4718 if ( GetDvarInt(
"zombie_default_max" ) == 0 )
4720 level waittill(
"forever" );
4751 level endon(
"end_of_round" );
4753 level waittill(
"kill_round" );
4763 self RecordPlayerDeathZombies();
4765 if ( IsDefined( level.deathcard_spawn_func ) )
4767 self [[level.deathcard_spawn_func]]();
4770 if( isdefined( level.func_clone_plant_respawn ) && isdefined(
self.s_clone_plant ) )
4772 self [[level.func_clone_plant_respawn]]();
4776 if( !IsDefined( level.zombie_vars[
"zombify_player"] ) || !level.zombie_vars[
"zombify_player"] )
4782 self.ignoreme =
true;
4783 self.is_zombie =
true;
4784 self.zombification_time = GetTime();
4786 self.team = level.zombie_team;
4787 self notify(
"zombified" );
4789 if( IsDefined(
self.revivetrigger ) )
4791 self.revivetrigger Delete();
4793 self.revivetrigger = undefined;
4795 self setMoveSpeedScale( 0.3 );
4796 self reviveplayer();
4798 self TakeAllWeapons();
4799 self DisableWeaponCycling();
4800 self DisableOffhandWeapons();
4810 self endon(
"death" );
4811 self endon(
"disconnect" );
4814 self.zombiehealth = level.zombie_health;
4821 self waittill(
"damage", amount, attacker, directionVec, point, type );
4823 if( !IsDefined( attacker ) || !IsPlayer( attacker ) )
4829 self.zombiehealth -= amount;
4831 if(
self.zombiehealth <= 0 )
4835 self waittill(
"playerzombie_downed_state_done" );
4836 self.zombiehealth = level.zombie_health;
4843 self endon(
"death" );
4844 self endon(
"disconnect" );
4853 self.playerzombie_soundboard_disable =
true;
4855 self DisableWeapons();
4856 self AllowStand(
false );
4857 self AllowCrouch(
false );
4858 self AllowProne(
true );
4860 while( GetTime() < endTime )
4865 self.playerzombie_soundboard_disable =
false;
4867 self EnableWeapons();
4868 self AllowStand(
true );
4869 self AllowCrouch(
false );
4870 self AllowProne(
false );
4872 self notify(
"playerzombie_downed_state_done" );
4877 self endon(
"death" );
4878 self endon(
"disconnect" );
4880 text = NewClientHudElem(
self );
4881 text.alignX =
"center";
4882 text.alignY =
"middle";
4883 text.horzAlign =
"user_center";
4884 text.vertAlign =
"user_bottom";
4885 text.foreground =
true;
4886 text.font =
"default";
4887 text.fontScale = 1.8;
4889 text.color = ( 1.0, 1.0, 1.0 );
4890 text SetText( &
"ZOMBIE_PLAYERZOMBIE_DOWNED" );
4893 if(
self IsSplitScreen() )
4898 text FadeOverTime( 0.1 );
4901 self waittill(
"playerzombie_downed_state_done" );
4903 text FadeOverTime( 0.1 );
4909 self endon(
"death" );
4910 self endon(
"disconnect" );
4916 if(
self.health < bighealth )
4918 self.health = bighealth;
4927 self endon(
"death" );
4928 self endon(
"disconnect" );
4930 self.playerzombie_soundboard_disable =
false;
4932 self.buttonpressed_use =
false;
4933 self.buttonpressed_attack =
false;
4934 self.buttonpressed_ads =
false;
4936 self.useSound_waitTime = 3 * 1000;
4937 self.useSound_nextTime = GetTime();
4938 useSound =
"playerzombie_usebutton_sound";
4940 self.attackSound_waitTime = 3 * 1000;
4941 self.attackSound_nextTime = GetTime();
4942 attackSound =
"playerzombie_attackbutton_sound";
4944 self.adsSound_waitTime = 3 * 1000;
4945 self.adsSound_nextTime = GetTime();
4946 adsSound =
"playerzombie_adsbutton_sound";
4948 self.inputSound_nextTime = GetTime();
4952 if(
self.playerzombie_soundboard_disable )
4958 if(
self UseButtonPressed() )
4964 self.useSound_nextTime = GetTime() +
self.useSound_waitTime;
4967 else if(
self AttackButtonPressed() )
4973 self.attackSound_nextTime = GetTime() +
self.attackSound_waitTime;
4976 else if(
self AdsButtonPressed() )
4982 self.adsSound_nextTime = GetTime() +
self.adsSound_waitTime;
4992 if( GetTime() <
self.inputSound_nextTime )
5002 if( GetTime() >=
self.useSound_nextTime && !
self.buttonpressed_use )
5009 if( GetTime() >=
self.attackSound_nextTime && !
self.buttonpressed_attack )
5016 if( GetTime() >=
self.useSound_nextTime && !
self.buttonpressed_ads )
5023 ASSERTMSG(
"can_do_input(): didn't recognize inputType of " + inputType );
5037 if( inputType !=
"use" && inputType !=
"attack" && inputType !=
"ads" )
5039 ASSERTMSG(
"playerzombie_waitfor_buttonrelease(): inputType of " + inputType +
" is not recognized." );
5043 notifyString =
"waitfor_buttonrelease_" + inputType;
5044 self notify( notifyString );
5045 self endon( notifyString );
5047 if( inputType ==
"use" )
5049 self.buttonpressed_use =
true;
5050 while(
self UseButtonPressed() )
5054 self.buttonpressed_use =
false;
5057 else if( inputType ==
"attack" )
5059 self.buttonpressed_attack =
true;
5060 while(
self AttackButtonPressed() )
5064 self.buttonpressed_attack =
false;
5067 else if( inputType ==
"ads" )
5069 self.buttonpressed_ads =
true;
5070 while(
self AdsButtonPressed() )
5074 self.buttonpressed_ads =
false;
5080 self notify(
"new_ignore_attacker" );
5081 self endon(
"new_ignore_attacker" );
5082 self endon(
"disconnect" );
5084 if( !isDefined( level.ignore_enemy_timer ) )
5086 level.ignore_enemy_timer = 0.4;
5089 wait( level.ignore_enemy_timer );
5091 self.ignoreAttacker = undefined;
5096 player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime );
5108 function player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime )
5110 iDamage =
self check_player_damage_callbacks( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime );
5112 if(
self.scene_takedamage ===
false )
5117 if ( IsDefined( eAttacker ) &&
IS_TRUE( eAttacker.b_aat_fire_works_weapon ) )
5122 if (
IS_TRUE(
self.use_adjusted_grenade_damage ) )
5124 self.use_adjusted_grenade_damage = undefined;
5125 if( (
self.health > iDamage ) )
5142 if ( isDefined( eInflictor ) )
5144 if (
IS_TRUE( eInflictor.water_damage ) )
5150 if ( isDefined( eAttacker ) )
5152 if(
IS_EQUAL( eAttacker.owner,
self ) )
5157 if( isDefined(
self.ignoreAttacker ) &&
self.ignoreAttacker == eAttacker )
5168 if( (isDefined( eAttacker.is_zombie ) && eAttacker.is_zombie) )
5170 self.ignoreAttacker = eAttacker;
5173 if ( isdefined( eAttacker.custom_damage_func ) )
5175 iDamage = eAttacker [[ eAttacker.custom_damage_func ]]( self );
5179 eAttacker notify(
"hit_player" );
5181 if ( isdefined( eAttacker ) && isdefined( eAttacker.func_mod_damage_override ) )
5183 sMeansOfDeath = eAttacker [[ eAttacker.func_mod_damage_override ]]( eInflictor, sMeansOfDeath, weapon );
5186 if( sMeansOfDeath !=
"MOD_FALLING" )
5189 if(
IS_TRUE(eattacker.is_zombie) || IsPlayer(eAttacker) )
5190 self PlayRumbleOnEntity(
"damage_heavy" );
5192 if(
IS_TRUE(eattacker.is_zombie) )
5199 if (
IS_TRUE( level.pers_upgrade_flopper ) )
5202 if (
IS_TRUE(
self.pers_upgrades_awarded[
"flopper" ] ) )
5204 canExert = ( sMeansOfDeath !=
"MOD_PROJECTILE_SPLASH" && sMeansOfDeath !=
"MOD_GRENADE" && sMeansOfDeath !=
"MOD_GRENADE_SPLASH" );
5210 if(RandomIntRange(0,1) == 0 )
5225 if ( isDefined( sMeansOfDeath) && sMeansOfDeath ==
"MOD_DROWN")
5228 self.voxDrowning =
true;
5231 if( isdefined( level.perk_damage_override ) )
5233 foreach( func
in level.perk_damage_override )
5235 n_damage =
self [[ func ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime );
5236 if( isdefined( n_damage ) )
5242 finalDamage = iDamage;
5253 self thread [[
self.player_damage_override ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime );
5257 if ( IsDefined( eInflictor ) && IsDefined( eInflictor.archetype ) && eInflictor.archetype ==
ARCHETYPE_ZOMBIE_QUAD )
5259 if ( sMeansOfDeath ==
"MOD_EXPLOSIVE" )
5261 if (
self.health > 75 )
5269 if ( sMeansOfDeath ==
"MOD_SUICIDE" &&
self bgb::is_enabled(
"zm_bgb_danger_closest" ) )
5274 if ( sMeansOfDeath ==
"MOD_PROJECTILE" || sMeansOfDeath ==
"MOD_PROJECTILE_SPLASH" || sMeansOfDeath ==
"MOD_GRENADE" || sMeansOfDeath ==
"MOD_GRENADE_SPLASH" || sMeansOfDeath ==
"MOD_EXPLOSIVE" )
5285 if ( !isdefined( eAttacker ) || ( !
IS_TRUE( eAttacker.is_zombie ) && !
IS_TRUE( eAttacker.b_override_explosive_damage_cap ) ) )
5288 if( isdefined(weapon.name) && ((weapon.name ==
"ray_gun") || ( weapon.name ==
"ray_gun_upgraded" )) )
5292 if ( (
self.health > 25 ) && ( iDamage > 25 ) )
5297 else if ( (
self.health > 75 ) && ( iDamage > 75 ) )
5305 if( iDamage <
self.health )
5307 if ( IsDefined( eAttacker ) )
5309 if( IsDefined( level.custom_kill_damaged_VO ) )
5311 eAttacker thread [[ level.custom_kill_damaged_VO ]]( self );
5315 eAttacker.sound_damage_player =
self;
5318 if(
IS_TRUE( eAttacker.missingLegs ) )
5329 if( isdefined( eAttacker ) )
5331 if(isDefined(eAttacker.animname) && eAttacker.animname ==
"zombie_dog")
5336 else if(
IS_TRUE(eAttacker.is_avogadro))
5345 if( level.intermission )
5347 level waittill(
"forever" );
5352 if ( level.scr_zm_ui_gametype ==
"zcleansed" && iDamage > 0 )
5354 if ( IsDefined( eAttacker ) && IsPlayer( eAttacker ) && eAttacker.team !=
self.team && ( ( !
IS_TRUE(
self.laststand ) && !
self laststand::player_is_in_laststand() ) || !IsDefined(
self.last_player_attacker ) ) )
5358 if ( IsDefined( eAttacker.maxhealth ) &&
IS_TRUE( eAttacker.is_zombie ) )
5360 eAttacker.health = eAttacker.maxhealth;
5365 if ( IsDefined( level.player_kills_player ) )
5367 self thread [[ level.player_kills_player]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime );
5375 if ( IsDefined( level.whoswho_laststand_func ) )
5377 self thread [[ level.whoswho_laststand_func]]();
5382 players = GetPlayers();
5384 for( i = 0; i < players.size; i++ )
5392 if( count < players.size || (isDefined(level._game_module_game_end_check) && ![[level._game_module_game_end_check]]()) )
5394 if ( IsDefined(
self.lives ) &&
self.lives > 0 &&
IS_TRUE( level.force_solo_quick_revive ) &&
self HasPerk(
PERK_QUICK_REVIVE ) )
5406 if ( players.size == 1 && level
flag::get(
"solo_game" ) )
5408 if (
IS_TRUE( level.no_end_game_check ) || ( isdefined( level.check_end_solo_game_override ) && [[level.check_end_solo_game_override]]() ) )
5414 self.intermission =
true;
5426 non_solo_death = ( ( count > 1 || ( players.size == 1 && !level
flag::get(
"solo_game" ) ) ) );
5427 if ( (solo_death || non_solo_death) && !
IS_TRUE(level.no_end_game_check ) )
5429 level notify(
"stop_suicide_trigger");
5430 self AllowProne(
true );
5432 if( !isdefined( vDir ) )
5434 vDir = ( 1.0, 0.0, 0.0 );
5436 self FakeDamageFrom(vDir);
5438 level notify(
"last_player_died");
5439 if ( isdefined(level.custom_player_fake_death) )
5440 self thread [[level.custom_player_fake_death]](vDir, sMeansOfDeath);
5445 if( count == players.size && !
IS_TRUE( level.no_end_game_check ) )
5447 if ( players.size == 1 && level
flag::get(
"solo_game" ))
5452 level notify(
"pre_end_game");
5459 level notify(
"end_game" );
5468 level notify(
"pre_end_game");
5475 level notify(
"end_game" );
5491 zombies = GetAITeamArray( level.zombie_team );
5492 foreach( zombie
in zombies )
5494 if ( isdefined( zombie.favoriteenemy ) && ( zombie.favoriteenemy ==
self ) )
5496 zombie.zombie_path_timer = 0;
5504 if ( !isdefined( level.player_damage_callbacks ) )
5509 for ( i = 0; i < level.player_damage_callbacks.size; i++ )
5511 newDamage =
self [[ level.player_damage_callbacks[i] ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime );
5512 if ( -1 != newDamage )
5524 if ( !isdefined( level.player_damage_callbacks ) )
5526 level.player_damage_callbacks = [];
5529 level.player_damage_callbacks[level.player_damage_callbacks.size] = func;
5536 self endon(
"remote_revive" );
5538 level.wait_and_revive =
true;
5540 if ( isdefined(
self.waiting_to_revive ) &&
self.waiting_to_revive ==
true )
5546 if(
IS_TRUE(
self.pers_upgrades_awarded[
"perk_lose"]) )
5551 self.waiting_to_revive =
true;
5554 if ( isdefined( level.exit_level_func ) )
5556 self thread [[ level.exit_level_func ]]();
5560 if ( GetPlayers().size == 1 )
5562 player = GetPlayers()[0];
5564 if ( !isdefined( level.move_away_points ) )
5571 solo_revive_time = 10.0;
5573 name = level.player_name_directive[
self GetEntityNumber()];
5574 self.revive_hud setText( &
"ZOMBIE_REVIVING_SOLO",
name );
5585 level.wait_and_revive =
false;
5588 self.waiting_to_revive =
false;
5591 if(
IS_TRUE(
self.pers_upgrades_awarded[
"perk_lose"]) )
5599 if( !IsDefined( level.vehicle_damage_callbacks ) )
5601 level.vehicle_damage_callbacks = [];
5604 level.vehicle_damage_callbacks[level.vehicle_damage_callbacks.size] = func;
5607 function vehicle_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
5610 if( IsDefined( level.vehicle_damage_callbacks ) )
5612 for( i = 0; i < level.vehicle_damage_callbacks.size; i++ )
5614 iDamage =
self [[ level.vehicle_damage_callbacks[i] ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal );
5619 self globallogic_vehicle::Callback_VehicleDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal );
5625 function actor_damage_override( inflictor, attacker,
damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, psOffsetTime, boneIndex, surfaceType )
5628 if ( !isdefined(
self ) || !isdefined( attacker ) )
5631 damage =
bgb::actor_damage_override( inflictor, attacker,
damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, psOffsetTime, boneIndex, surfaceType );
5633 damage =
self check_actor_damage_callbacks( inflictor, attacker,
damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, psOffsetTime, boneIndex, surfaceType );
5635 self.knuckles_extinguish_flames = (weapon.name ==
"tazer_knuckles");
5637 if ( isdefined( attacker.animname ) && attacker.animname ==
"quad_zombie" )
5639 if ( isdefined(
self.animname ) &&
self.animname ==
"quad_zombie" )
5645 if ( isdefined(
self.killby_interdimensional_gun_hole ) )
5649 else if ( isdefined(
self.interdimensional_gun_kill ) )
5651 if ( isdefined(
self.idgun_damage_cb ) )
5653 self [[
self.idgun_damage_cb ]]( inflictor, attacker );
5659 if ( isdefined( weapon ) )
5661 if(
is_idgun_damage( weapon ) && ( !IsDefined( meansofdeath ) || meansofdeath !=
"MOD_EXPLOSIVE" ) )
5665 self.damageOrigin = vpoint;
5666 self.allowdeath =
false;
5667 self.magic_bullet_shield =
true;
5668 self.interdimensional_gun_kill =
true;
5669 self.interdimensional_gun_weapon = weapon;
5670 self.interdimensional_gun_attacker = attacker;
5672 if ( isdefined( inflictor ) )
5674 self.interdimensional_gun_inflictor = inflictor;
5678 self.interdimensional_gun_inflictor = attacker;
5682 if ( isdefined(
self.idgun_damage_cb ) )
5684 self [[
self.idgun_damage_cb ]]( inflictor, attacker );
5693 if ( !isplayer( attacker ) && isdefined(
self.non_attacker_func ) )
5695 if(
IS_TRUE(
self.non_attack_func_takes_attacker))
5697 return self [[
self.non_attacker_func ]](
damage, weapon, attacker );
5701 return self [[
self.non_attacker_func ]](
damage, weapon );
5705 if ( IsDefined( attacker ) && IsAI( attacker ) )
5708 if(
self.team == attacker.team && meansofdeath ==
"MOD_MELEE" )
5714 if ( attacker.classname ==
"script_vehicle" && isDefined( attacker.owner ) )
5716 attacker = attacker.owner;
5719 if ( !isdefined(
damage ) || !isdefined( meansofdeath ) )
5724 if ( meansofdeath ==
"" )
5730 if ( IsDefined(
self.aiOverrideDamage ) )
5732 for ( index = 0; index <
self.aiOverrideDamage.size; index++ )
5734 damageCallback =
self.aiOverrideDamage[index];
5735 damage =
self [[damageCallback]]( inflictor, attacker,
damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, psOffsetTime, boneIndex, undefined );
5746 if ( IsDefined(
self.actor_damage_func ) )
5748 final_damage = [[
self.actor_damage_func ]]( inflictor, attacker,
damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, psOffsetTime, boneIndex );
5753 if ( GetDvarInt(
"scr_perkdebug") )
5754 println(
"Perk/> Damage Factor: " + final_damage/old_damage +
" - Pre Damage: " + old_damage +
" - Post Damage: " + final_damage );
5759 if (
int( final_damage ) >=
self.health )
5761 self.water_damage =
true;
5766 if ( IsDefined( inflictor ) && IsDefined( inflictor.archetype ) && inflictor.archetype ==
ARCHETYPE_GLAIVE )
5768 if( meansofdeath ==
"MOD_CRUSH" )
5770 if ( ( IsDefined( inflictor.enemy ) && inflictor.enemy !=
self ) ||
IS_TRUE( inflictor._glaive_must_return_to_owner ) )
5774 final_damage +=
self.health;
5775 if ( IsActor(
self ) )
5788 if ( isdefined( inflictor ) && isPlayer( attacker ) && attacker == inflictor )
5790 if ( meansofdeath ==
"MOD_HEAD_SHOT" || meansofdeath ==
"MOD_PISTOL_BULLET" || meansofdeath ==
"MOD_RIFLE_BULLET" )
5796 if (
IS_TRUE( level.headshots_only ) && isDefined( attacker ) && isplayer( attacker ) )
5798 if ( meansofdeath ==
"MOD_MELEE" && ( sHitLoc ==
"head" || sHitLoc ==
"helmet" ) )
5800 return int( final_damage );
5804 return int( final_damage );
5812 return int( final_damage );
5815 function check_actor_damage_callbacks( inflictor, attacker,
damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, psOffsetTime, boneIndex, surfaceType )
5817 if ( !isdefined( level.actor_damage_callbacks ) )
5822 for ( i = 0; i < level.actor_damage_callbacks.size; i++ )
5824 newDamage =
self [[ level.actor_damage_callbacks[i] ]]( inflictor, attacker,
damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, psOffsetTime, boneIndex, surfaceType );
5825 if ( -1 != newDamage )
5837 if ( !isdefined( level.actor_damage_callbacks ) )
5839 level.actor_damage_callbacks = [];
5842 level.actor_damage_callbacks[level.actor_damage_callbacks.size] = func;
5847 function actor_damage_override_wrapper( inflictor, attacker,
damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, modelIndex, surfaceType, vSurfaceNormal )
5849 damage_override =
self actor_damage_override( inflictor, attacker,
damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, psOffsetTime, boneIndex, surfaceType );
5850 willBeKilled = (
self.health - damage_override ) <= 0;
5851 if( isdefined( level.zombie_damage_override_callbacks ) )
5853 foreach( func_override
in level.zombie_damage_override_callbacks )
5855 self thread [[ func_override ]]( willBeKilled, inflictor, attacker,
damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, psOffsetTime, boneIndex, surfaceType );
5859 if ( !willBeKilled || !
IS_TRUE(
self.dont_die_on_me ) )
5861 self finishActorDamage( inflictor, attacker, damage_override, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, surfaceType, vSurfaceNormal );
5867 DEFAULT( level.zombie_damage_override_callbacks, [] );
5869 ARRAY_ADD( level.zombie_damage_override_callbacks, func );
5874 if ( game[
"state"] ==
"postgame" )
5879 if( isai(attacker) && isDefined( attacker.script_owner ) )
5883 if ( attacker.script_owner.team !=
self.team )
5884 attacker = attacker.script_owner;
5887 if( attacker.classname ==
"script_vehicle" && isDefined( attacker.owner ) )
5889 attacker = attacker.owner;
5892 if ( isdefined( attacker ) && isplayer( attacker ) )
5903 if ( IsDefined(
self.animname) )
5905 switch(
self.animname )
5914 type =
"zombiekill";
5925 self.deathanim = undefined;
5930 self [[
self.actor_killed_override ]]( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
5933 if ( IsDefined(
self.deathFunction ) )
5935 self [[
self.deathFunction ]]( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
5944 level waittill(
"end_of_round" );
5946 demo::bookmark(
"zm_round_end", gettime(), undefined, undefined, 1 );
5947 BBPostDemoStreamStatsForRound( level.round_number );
5963 if( !
IS_TRUE( level.dash_counter_round_reached_5 ) )
5969 if( !
IS_TRUE( level.dash_counter_round_reached_10 ) )
5981 if( level.dash_counter_start_player_count != level.players.size )
5990 level waittill (
"end_game" );
5994 /# println(
"end_game TRIGGERED " ); #/
5996 setmatchflag(
"game_ended", 1 );
5999 level
clientfield::set(
"game_end_time",
int( ( GetTime() - level.n_gameplay_start_time + 500 ) / 1000 ) );
6001 util::clientnotify(
"zesn" );
6006 players = GetPlayers();
6007 for ( i = 0; i < players.size; i++ )
6012 for ( i = 0; i < players.size; i++ )
6016 players[i] RecordPlayerDeathZombies();
6023 if( isdefined( players[i].reviveTextHud ) )
6025 players[i].reviveTextHud
destroy();
6031 level.intermission =
true;
6032 level.zombie_vars[
"zombie_powerup_insta_kill_time"] = 0;
6033 level.zombie_vars[
"zombie_powerup_fire_sale_time"] = 0;
6034 level.zombie_vars[
"zombie_powerup_double_points_time"] = 0;
6040 players = GetPlayers();
6043 setMatchFlag(
"disableIngameMenu", 1 );
6044 foreach( player
in players )
6046 player closeInGameMenu();
6047 player CloseMenu(
"StartMenu_Main" );
6052 foreach( player
in players )
6054 player setDStat(
"AfterActionReportStats",
"lobbyPopup",
"summary" );
6057 if(!isDefined(level._supress_survived_screen))
6060 for( i = 0; i < players.size; i++ )
6062 game_over[i] = NewClientHudElem( players[i] );
6063 survived[i] = NewClientHudElem( players[i] );
6064 if ( IsDefined( level.custom_game_over_hud_elem ) )
6066 [[ level.custom_game_over_hud_elem ]]( players[i], game_over[i], survived[i] );
6070 game_over[i].alignX =
"center";
6071 game_over[i].alignY =
"middle";
6072 game_over[i].horzAlign =
"center";
6073 game_over[i].vertAlign =
"middle";
6074 game_over[i].y -= 130;
6075 game_over[i].foreground =
true;
6076 game_over[i].fontScale = 3;
6077 game_over[i].alpha = 0;
6078 game_over[i].color = ( 1.0, 1.0, 1.0 );
6079 game_over[i].hidewheninmenu =
true;
6080 game_over[i] SetText( &
"ZOMBIE_GAME_OVER" );
6082 game_over[i] FadeOverTime( 1 );
6083 game_over[i].alpha = 1;
6084 if ( players[i] isSplitScreen() )
6086 game_over[i].fontScale = 2;
6087 game_over[i].y += 40;
6090 survived[i].alignX =
"center";
6091 survived[i].alignY =
"middle";
6092 survived[i].horzAlign =
"center";
6093 survived[i].vertAlign =
"middle";
6094 survived[i].y -= 100;
6095 survived[i].foreground =
true;
6096 survived[i].fontScale = 2;
6097 survived[i].alpha = 0;
6098 survived[i].color = ( 1.0, 1.0, 1.0 );
6099 survived[i].hidewheninmenu =
true;
6100 if ( players[i] isSplitScreen() )
6102 survived[i].fontScale = 1.5;
6103 survived[i].y += 40;
6109 if( level.round_number < 2 )
6111 if( level.script ==
"zm_moon" )
6113 if( !isdefined(level.left_nomans_land) )
6115 nomanslandtime = level.nml_best_time;
6116 player_survival_time = int( nomanslandtime/1000 );
6117 player_survival_time_in_mins =
zm::to_mins( player_survival_time );
6118 survived[i] SetText( &
"ZOMBIE_SURVIVED_NOMANS", player_survival_time_in_mins );
6120 else if( level.left_nomans_land == 2 )
6122 survived[i] SetText( &
"ZOMBIE_SURVIVED_ROUND" );
6127 survived[i] SetText( &
"ZOMBIE_SURVIVED_ROUND" );
6132 survived[i] SetText( &
"ZOMBIE_SURVIVED_ROUNDS", level.round_number );
6135 survived[i] FadeOverTime( 1 );
6136 survived[i].alpha = 1;
6142 if(isDefined(level.custom_end_screen))
6144 level [[level.custom_end_screen]]();
6147 for (i = 0; i < players.size; i++)
6149 players[i] SetClientUIVisibilityFlag(
"weapon_hud_visible", 0 );
6150 players[i] SetClientMiniScoreboardHide(
true );
6153 players[i] notify(
"report_bgb_consumption" );
6166 recordGameResult(
"draw" );
6172 if( SessionModeIsOnlineGame() )
6178 finalizeMatchRecord();
6182 players = GetPlayers();
6183 foreach( player
in players )
6185 if( IsDefined( player.sessionstate ) && player.sessionstate ==
"spectator" )
6187 player.sessionstate =
"playing";
6194 if ( !
IS_TRUE(level.host_ended_game) && GetDvarInt(
"scr_restart_on_wipe" ) > 1 )
6196 LUINotifyEvent( &
"force_scoreboard", 0 );
6197 map_restart(
true );
6202 players = GetPlayers();
6204 LUINotifyEvent( &
"force_scoreboard", 1, 1 );
6208 wait( level.zombie_vars[
"zombie_intermission_time"] );
6211 if ( !isDefined( level._supress_survived_screen ) )
6213 for ( i = 0; i < players.size; i++ )
6215 survived[i] Destroy();
6216 game_over[i] Destroy();
6221 for ( i = 0; i < players.size; i++ )
6223 if(isDefined(players[i].survived_hud ) )
6224 players[i].survived_hud Destroy();
6225 if (isDefined( players[i].game_over_hud ) )
6226 players[i].game_over_hud Destroy();
6230 level notify(
"stop_intermission" );
6235 players = GetPlayers();
6236 for ( i = 0; i < players.size; i++ )
6238 players[i] CameraActivate(
false );
6242 if ( !
IS_TRUE(level.host_ended_game) && GetDvarInt(
"scr_restart_on_wipe" ) )
6244 LUINotifyEvent( &
"force_scoreboard", 1, 0 );
6245 map_restart(
true );
6264 self FreezeControls(
true );
6272 level.disable_intermission =
true;
6274 level.disable_intermission = undefined;
6283 if( IsDefined(level.disable_intermission) )
6287 if( !IsDefined(level.disable_intermission) )
6304 players = GetPlayers();
6305 for( i = 0; i < players.size; i++ )
6307 players[i] uploadleaderboards();
6314 level.global_zombies_killed = 0;
6315 level.zombies_timeout_spawn = 0;
6316 level.zombies_timeout_playspace = 0;
6317 level.zombies_timeout_undamaged = 0;
6318 level.zombie_player_killed_count = 0;
6319 level.zombie_trap_killed_count = 0;
6320 level.zombie_pathing_failed = 0;
6321 level.zombie_breadcrumb_failed = 0;
6327 incrementCounter(
"global_zombies_killed", level.global_zombies_killed );
6328 incrementCounter(
"global_zombies_killed_by_players", level.zombie_player_killed_count );
6329 incrementCounter(
"global_zombies_killed_by_traps", level.zombie_trap_killed_count );
6334 level notify (
"fake_death");
6335 self notify (
"fake_death");
6337 self TakeAllWeapons();
6338 self AllowStand(
false );
6339 self AllowCrouch(
false );
6340 self AllowProne(
true );
6342 self.ignoreme =
true;
6343 self EnableInvulnerability();
6346 self FreezeControls(
true );
6351 self AllowStand(
true );
6352 self AllowCrouch(
false );
6353 self AllowProne(
false );
6359 function player_killed_override(eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration)
6362 level waittill(
"forever" );
6367 self notify(
"stop_player_zombie_breadcrumb");
6368 self endon(
"stop_player_zombie_breadcrumb");
6369 self endon(
"disconnect" );
6370 self endon(
"spawned_spectator" );
6371 level endon(
"intermission" );
6373 self.zombie_breadcrumbs = [];
6374 self.zombie_breadcrumb_distance = 24 * 24;
6375 self.zombie_breadcrumb_area_num = 3;
6376 self.zombie_breadcrumb_area_distance = 16;
6379 last_crumb =
self.origin;
6404 crumb =
self.origin;
6407 if ( !
self IsOnGround() &&
self isinvehicle() )
6409 trace = bullettrace(
self.origin + (0,0,10),
self.origin,
false, undefined );
6410 crumb =
trace[
"position"];
6421 if( !airborne && DistanceSquared( crumb, last_crumb ) <
self.zombie_breadcrumb_distance )
6426 if ( airborne &&
self IsOnGround() )
6433 if( isDefined( level.custom_breadcrumb_store_func ) )
6438 if( isDefined( level.custom_airborne_func ) )
6440 airborne =
self [[ level.custom_airborne_func ]]( airborne );
6447 if( IsDefined(
self.node) )
6467 for( j = 1; j <=
self.zombie_breadcrumb_area_num; j++ )
6469 offset = ( j *
self.zombie_breadcrumb_area_distance );
6471 offsets[0] = ( origin[0] - offset, origin[1], origin[2] );
6472 offsets[1] = ( origin[0] + offset, origin[1], origin[2] );
6473 offsets[2] = ( origin[0], origin[1] - offset, origin[2] );
6474 offsets[3] = ( origin[0], origin[1] + offset, origin[2] );
6476 offsets[4] = ( origin[0] - offset, origin[1], origin[2] + height_offset );
6477 offsets[5] = ( origin[0] + offset, origin[1], origin[2] + height_offset );
6478 offsets[6] = ( origin[0], origin[1] - offset, origin[2] + height_offset );
6479 offsets[7] = ( origin[0], origin[1] + offset, origin[2] + height_offset );
6481 for ( i = 0; i < offsets.size; i++ )
6483 self.zombie_breadcrumbs[index] = offsets[i];
6500 minutes = int( seconds / 60 );
6502 seconds = int( seconds * 1000 ) % ( 60 * 1000 );
6503 seconds = seconds * 0.001;
6507 hours = int( minutes / 60 );
6508 minutes = int( minutes * 1000 ) % ( 60 * 1000 );
6509 minutes = minutes * 0.001;
6515 hours =
"0" + hours;
6520 minutes =
"0" + minutes;
6523 seconds = Int( seconds );
6526 seconds =
"0" + seconds;
6529 combined =
"" + hours +
":" + minutes +
":" + seconds;
6544 level.intermission =
true;
6545 level notify(
"intermission" );
6547 players = GetPlayers();
6548 for( i = 0; i < players.size; i++ )
6550 players[i] SetClientThirdPerson( 0 );
6551 players[i] resetFov();
6553 players[i].health = 100;
6554 players[i] thread [[level.custom_intermission]]();
6556 players[i] StopSounds();
6561 players = GetPlayers();
6562 for( i = 0; i < players.size; i++ )
6573 zombies = GetAiTeamArray( level.zombie_team );
6574 for( i = 0; i < zombies.size; i++ )
6576 if( !IsAlive( zombies[i] ) )
6581 zombies[i] SetGoal( zombies[i].origin );
6584 for( i = 0; i < zombies.size; i++ )
6586 if( !IsAlive( zombies[i] ) )
6591 if (
IS_TRUE( zombies[i].ignore_game_over_death ) )
6596 wait( 0.5 + RandomFloat( 2 ) );
6598 if ( isdefined( zombies[i] ) )
6600 if( !IsVehicle( zombies[i] ) )
6611 #define INTERMISSION_STREAMER_HINT_PRIORITY 0.9
6622 self closeInGameMenu();
6623 self CloseMenu(
"StartMenu_Main" );
6625 self notify(
"player_intermission");
6626 self endon(
"player_intermission");
6627 level endon(
"stop_intermission" );
6628 self endon(
"disconnect");
6629 self endon(
"death");
6630 self notify(
"_zombie_game_over" );
6633 self.score =
self.score_total;
6637 if( !IsDefined( points ) || points.size == 0 )
6639 points = getentarray(
"info_intermission",
"classname" );
6640 if( points.size < 1 )
6642 /# println(
"NO info_intermission POINTS IN MAP" ); #/
6647 if (
IS_TRUE( level.b_show_single_intermission ) )
6649 a_s_temp_points = array::randomize( points );
6651 points[0] = array::random( a_s_temp_points );
6655 points = array::randomize( points );
6666 self.sessionstate =
"intermission";
6667 self.spectatorclient = -1;
6668 self.killcamentity = -1;
6669 self.archivetime = 0;
6670 self.psoffsettime = 0;
6671 self.friendlydamage = undefined;
6672 if ( isdefined( level.player_intemission_spawn_callback ) )
6674 self thread [[ level.player_intemission_spawn_callback ]] ( points[0].origin, points[0].angles );
6679 for( i = 0; i < points.size; i++ )
6682 nextpoint = points[i+1];
6684 self SetOrigin( point.origin );
6685 self SetPlayerAngles( point.angles );
6688 self notify(
"player_intermission_spawned");
6690 if ( IsDefined(nextpoint) )
6703 if ( points.size == 1 )
6714 self FadeOverTime( t );
6720 zombies = GetAiTeamArray( level.zombie_team );
6721 for ( i = 0; i < zombies.size; i++ )
6723 if (
IS_TRUE( zombies[i].ignore_solo_last_stand ) )
6728 if ( isDefined( zombies[i].find_exit_point ) )
6730 zombies[i] thread [[ zombies[i].find_exit_point ]]();
6734 if ( zombies[i].ignoreme )
6747 self endon(
"death" );
6751 if ( !level
flag::get(
"wait_and_revive" ) )
6757 if ( !
self.ignoreme )
6769 self endon(
"death" );
6771 player = GetPlayers()[0];
6777 away = VectorNormalize(
self.origin - player.origin );
6778 endPos =
self.origin + VectorScale( away, 600 );
6780 if ( isdefined( level.zm_loc_types[
"wait_location" ] ) && level.zm_loc_types[
"wait_location" ].size > 0 )
6782 locs = array::randomize( level.zm_loc_types[
"wait_location" ] );
6787 locs = array::randomize( level.zm_loc_types[
"dog_location" ] );
6790 for ( i = 0; i < locs.size; i++ )
6792 dist_zombie = DistanceSquared( locs[i].origin, endPos );
6793 dist_player = DistanceSquared( locs[i].origin, player.origin );
6795 if ( dist_zombie < dist_player )
6802 self notify(
"stop_find_flesh" );
6803 self notify(
"zombie_acquire_enemy" );
6805 if( isdefined( locs[dest] ) )
6807 self SetGoal( locs[dest].origin );
6813 b_passed_override =
true;
6816 if ( IsDefined( level.default_find_exit_position_override ) )
6818 b_passed_override = [[ level.default_find_exit_position_override ]]();
6821 if ( !level
flag::get(
"wait_and_revive" ) && b_passed_override )
6833 players = GetPlayers();
6834 num = RandomIntRange( 0, players.size );
6841 if ( !IsDefined( level.zombie_sidequest_stat ) )
6843 level.zombie_sidequest_previously_completed = [];
6844 level.zombie_sidequest_stat = [];
6847 level.zombie_sidequest_stat[id] = sidequest_stat;
6852 level.zombie_sidequest_previously_completed[id] =
false;
6855 if ( !level.onlineGame )
6861 if (
IS_TRUE( level.zm_disable_recording_stats ) )
6866 players = GetPlayers();
6867 for ( i = 0; i < players.size; i++ )
6871 level.zombie_sidequest_previously_completed[id] =
true;
6880 return IS_TRUE( level.zombie_sidequest_previously_completed[
id] );
6886 level notify(
"zombie_sidequest_completed",
id );
6887 level.zombie_sidequest_previously_completed[id] =
true;
6890 if ( !level.onlineGame )
6896 if (
IS_TRUE( level.zm_disable_recording_stats ) )
6901 players = GetPlayers();
6902 for ( i = 0; i < players.size; i++ )
6904 if ( isdefined( level.zombie_sidequest_stat[
id] ) )
6913 if(
IS_TRUE(attacker.is_zombie) || (isdefined( attacker.archetype ) && attacker.archetype ==
"margwa" ) )
6915 self playsoundtoplayer(
"evt_player_swiped",
self );
6923 if( SessionModeIsSystemlink() )
6929 globalLeaderboards =
"LB_ZM_GB_BULLETS_FIRED_AT ";
6930 globalLeaderboards +=
"LB_ZM_GB_BULLETS_HIT_AT ";
6931 globalLeaderboards +=
"LB_ZM_GB_DISTANCE_TRAVELED_AT ";
6932 globalLeaderboards +=
"LB_ZM_GB_DOORS_PURCHASED_AT ";
6933 globalLeaderboards +=
"LB_ZM_GB_GRENADE_KILLS_AT ";
6934 globalLeaderboards +=
"LB_ZM_GB_HEADSHOTS_AT ";
6935 globalLeaderboards +=
"LB_ZM_GB_KILLS_AT ";
6936 globalLeaderboards +=
"LB_ZM_GB_PERKS_DRANK_AT ";
6937 globalLeaderboards +=
"LB_ZM_GB_REVIVES_AT ";
6940 globalLeaderboards +=
"LB_ZM_GB_KILLSTATS_MR ";
6941 globalLeaderboards +=
"LB_ZM_GB_GAMESTATS_MR ";
6943 if ( !level.rankedMatch && (GetDvarInt(
"zm_private_rankedmatch", 0 ) == 0) )
6945 precacheLeaderboards( globalLeaderboards );
6950 mapname = GetDvarString(
"mapname" );
6951 expectedPlayerNum = GetNumExpectedPlayers();
6953 mapLeaderboard =
"LB_ZM_MAP_"+ getsubstr( mapname, 3, mapname.size ) +
"_" + expectedPlayerNum +
"PLAYER";
6955 precacheLeaderboards( globalLeaderboards + mapLeaderboard );
6960 if( level.passed_introscreen)
6962 self setClientUIVisibilityFlag(
"hud_visible", 1 );
6963 self setClientUIVisibilityFlag(
"weapon_hud_visible", 1 );
6976 self.hud_damagefeedback = newdamageindicatorhudelem(
self);
6977 self.hud_damagefeedback.horzAlign =
"center";
6978 self.hud_damagefeedback.vertAlign =
"middle";
6979 self.hud_damagefeedback.x = -12;
6980 self.hud_damagefeedback.y = -12;
6981 self.hud_damagefeedback.alpha = 0;
6982 self.hud_damagefeedback.archived =
true;
6983 self.hud_damagefeedback setShader(
"damage_feedback", 24, 48 );
6984 self.hitSoundTracker =
true;
6998 self notify(
"watchDisconnect");
6999 self endon(
"watchDisconnect");
7000 self waittill(
"disconnect");
7008 players = GetPlayers();
7009 foreach(player
in players)
7024 if (!IsDefined(level.navcards))
7026 players = GetPlayers();
7027 foreach( player
in players )
7030 for(i = 0;i < level.navcards.size; i++)
7033 if (isdefined(player.navcard_grabbed) && player.navcard_grabbed == level.navcards[i] )
7037 navcard_bits +=( 1 << i );
7042 if ( navcard_bits > 0 )
7056 level.laststandpistol = level.default_laststandpistol;
7060 level.laststandpistol = level.default_solo_laststandpistol;
7070 if ( level.scr_zm_ui_gametype ==
"zgrief" || level.scr_zm_ui_gametype ==
"zmeat" )
7075 if ( GetPlayers().size > max_players )
7078 level notify(
"end_game");
7086 if( isdefined( level.idgun_weapons ) )
7088 if ( IsInArray( level.idgun_weapons, weapon ) )
7102 self endon(
"death" );
7103 self endon(
"disconnnect" );
7105 self.am_i_valid =
true;
7106 while ( isDefined(
self ) )
7115 self endon(
"death" );
7116 self endon(
"disconnnect" );
7119 if ( isDefined(
self.zone_name ) )
7121 self.previous_zone_name =
self.zone_name;
7124 while ( isDefined(
self ) )
7126 if( isDefined(
self.zone_name ) )
7128 self.previous_zone_name =
self.zone_name;
7132 wait RandomFloatRange( 0.5, 1.0 );
7139 outputString =
"\n------------------- BEGIN HASH ID DUMP -----------------------------\n";
7143 outputString +=
"** CRAFTABLES **\n";
7144 foreach( s_craftable
in level.zombie_include_craftables )
7146 outputString +=
"+" + s_craftable.name +
"," + s_craftable.hash_id +
"\n";
7147 if (!isDefined(s_craftable.a_piecestubs))
7152 foreach( s_piece
in s_craftable.a_piecestubs )
7154 outputString += s_piece.pieceName +
"," + s_piece.hash_id +
"\n";
7159 outputString +=
"** POWERUPS **\n";
7160 foreach ( powerup
in level.zombie_powerups)
7162 outputString += powerup.powerup_name +
"," + powerup.hash_id +
"\n";
7166 outputString +=
"** AAT **\n";
7169 foreach (aat
in level.aat)
7171 if (!isDefined(aat) || !isDefined(aat.name) || aat.name ==
"none")
7175 outputString += aat.name +
"," + aat.hash_id +
"\n";
7180 outputString +=
"** PERKS **\n";
7181 foreach (perk
in level._custom_perks)
7183 if (!isDefined(perk) || !isDefined(perk.alias))
7187 outputString += perk.alias +
"," + perk.hash_id +
"\n";
7190 outputString +=
"------------------- END HASH ID DUMP -----------------------------\n";
7191 PrintLn(outputString);