Guest User

zombiemode.gsc

a guest
Aug 10th, 2012
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 88.12 KB | None | 0 0
  1. #include maps\_anim;
  2. #include maps\_utility;
  3. #include common_scripts\utility;
  4. #include maps\_music;
  5. #include maps\_zombiemode_utility;
  6. #include maps\_busing;
  7.  
  8. #using_animtree( "generic_human" );
  9.  
  10. main(init_zombie_spawner_name)
  11. {
  12. precache_shaders();
  13. precache_models();
  14.  
  15. PrecacheItem( "fraggrenade" );
  16. PrecacheItem( "colt" );
  17.  
  18. init_strings();
  19. init_levelvars();
  20. init_animscripts();
  21. init_sounds();
  22. init_shellshocks();
  23. init_flags();
  24.  
  25. //Limit zombie to 24 max, must have for network purposes
  26. SetAILimit( 24 );
  27. // the initial spawners
  28. if( !IsDefined( init_zombie_spawner_name) )
  29. {
  30. level.enemy_spawns = getEntArray( "zombie_spawner_init", "targetname" );
  31. }
  32. else
  33. {
  34. level.enemy_spawns = getEntArray( init_zombie_spawner_name, "targetname" );
  35. }
  36.  
  37. level.zombie_rise_spawners = [];
  38.  
  39. //maps\_destructible_type94truck::init();
  40.  
  41. level.custom_introscreen = ::zombie_intro_screen;
  42. level.custom_intermission = ::player_intermission;
  43. level.reset_clientdvars = ::onPlayerConnect_clientDvars;
  44.  
  45. init_fx();
  46.  
  47.  
  48. // load map defaults
  49. maps\_load::main();
  50.  
  51. level.hudelem_count = 0;
  52. // Call the other zombiemode scripts
  53. if( level.script == "nazi_zombie_sumpf" )
  54. {
  55. maps\_zombiemode_weapons_sumpf::init();
  56. }
  57. else
  58. {
  59. maps\_zombiemode_weapons::init();
  60. }
  61. maps\_zombiemode_blockers_new::init();
  62. maps\_zombiemode_spawner::init();
  63. maps\_zombiemode_powerups::init();
  64. maps\_zombiemode_radio::init();
  65. maps\_zombiemode_perks::init();
  66. maps\_zombiemode_tesla::init();
  67. maps\_zombiemode_dogs::init();
  68. maps\_zombiemode_bowie::bowie_init();
  69. maps\_zombiemode_cymbal_monkey::init();
  70. maps\_zombiemode_betty::init();
  71. maps\_zombiemode_timer::init();
  72. maps\_zombiemode_auto_turret::init();
  73.  
  74. /#
  75. maps\_zombiemode_devgui::init();
  76. #/
  77.  
  78. init_utility();
  79.  
  80. // register a client system...
  81. maps\_utility::registerClientSys("zombify");
  82.  
  83. // level thread coop_player_spawn_placement();
  84.  
  85. // zombie ai and anim inits
  86. init_anims();
  87.  
  88. if( isDefined( level.custom_ai_type ) )
  89. {
  90. for( i = 0; i < level.custom_ai_type.size; i++ )
  91. {
  92. [[ level.custom_ai_type[i] ]]();
  93. }
  94. }
  95.  
  96.  
  97. // Sets up function pointers for animscripts to refer to
  98. level.playerlaststand_func = ::player_laststand;
  99. // level.global_kill_func = maps\_zombiemode_spawner::zombie_death;
  100. level.global_damage_func = maps\_zombiemode_spawner::zombie_damage;
  101. level.global_damage_func_ads = maps\_zombiemode_spawner::zombie_damage_ads;
  102. level.overridePlayerKilled = ::player_killed_override;
  103. level.overridePlayerDamage = ::player_damage_override;
  104.  
  105. level.melee_miss_func = maps\_zombiemode::zombiemode_melee_miss;
  106.  
  107. if( !IsDefined( level.Player_Spawn_func ) )
  108. {
  109. level.Player_Spawn_func = ::coop_player_spawn_placement;
  110. }
  111.  
  112. level thread [[level.Player_Spawn_func]]();
  113. // used to a check in last stand for players to become zombies
  114. level.is_zombie_level = true;
  115. level.player_becomes_zombie = ::zombify_player;
  116.  
  117. // so we dont get the uber colt when we're knocked out
  118. level.laststandpistol = "colt";
  119.  
  120. level.round_start_time = 0;
  121.  
  122. level thread onPlayerConnect();
  123.  
  124. init_dvars();
  125. initZombieLeaderboardData();
  126.  
  127.  
  128. flag_wait( "all_players_connected" );
  129.  
  130. bbPrint( "sessions: mapname %s gametype zom isserver 1", level.script );
  131.  
  132.  
  133.  
  134. //thread zombie_difficulty_ramp_up();
  135.  
  136. // Start the Zombie MODE!
  137. level thread end_game();
  138. level thread round_start();
  139. level thread players_playing();
  140. if ( IsDefined( level.crawlers_enabled ) && level.crawlers_enabled == 1 )
  141. {
  142. level thread crawler_round_tracker();
  143. }
  144.  
  145. //chrisp - adding spawning vo
  146. level thread spawn_vo();
  147.  
  148. //add ammo tracker for VO
  149. level thread track_players_ammo_count();
  150.  
  151. //level thread prevent_near_origin();
  152.  
  153. DisableGrenadeSuicide();
  154.  
  155. level.startInvulnerableTime = GetDvarInt( "player_deathInvulnerableTime" );
  156.  
  157. // Do a SaveGame, so we can restart properly when we die
  158. SaveGame( "zombie_start", &"AUTOSAVE_LEVELSTART", "", true );
  159.  
  160. // TESTING
  161. // wait( 3 );
  162. // level thread intermission();
  163. // thread testing_spawner_bug();
  164.  
  165. if(!IsDefined(level.eggs) )
  166. {
  167. level.eggs = 0;
  168. }
  169. }
  170.  
  171. zombiemode_melee_miss()
  172. {
  173. if( isDefined( self.enemy.curr_pay_turret ) )
  174. {
  175. self.enemy DoDamage( (60 / GetDvarFloat("player_damageMultiplier")), self.origin, self, self );
  176. }
  177. }
  178.  
  179. /*------------------------------------
  180. chrisp - adding vo to track players ammo
  181. ------------------------------------*/
  182. track_players_ammo_count()
  183. {
  184. self endon("disconnect");
  185. self endon("death");
  186. if(!IsDefined (level.player_ammo_low))
  187. {
  188. level.player_ammo_low = 0;
  189. }
  190. if(!IsDefined(level.player_ammo_out))
  191. {
  192. level.player_ammo_out = 0;
  193. }
  194. while(1)
  195. {
  196. players = get_players();
  197. for(i=0;i<players.size;i++)
  198. {
  199.  
  200. weap = players[i] getcurrentweapon();
  201. //iprintln("current weapon: " + weap);
  202. //iprintlnbold(weap);
  203. //Excludes all Perk based 'weapons' so that you don't get low ammo spam.
  204. if(!isDefined(weap) || weap == "none" || weap == "zombie_perk_bottle_doubletap" || weap == "zombie_perk_bottle_jugg" || weap == "zombie_perk_bottle_revive" || weap == "zombie_perk_bottle_sleight" || weap == "mine_bouncing_betty" || weap == "syrette" || weap == "zombie_knuckle_crack" || weap == "zombie_bowie_flourish" )
  205. {
  206. continue;
  207. }
  208. //iprintln("checking ammo for " + weap);
  209. if ( players[i] GetAmmoCount( weap ) > 5)
  210. {
  211. continue;
  212. }
  213. if ( players[i] maps\_laststand::player_is_in_laststand() )
  214. {
  215. continue;
  216. }
  217. else if (players[i] GetAmmoCount( weap ) < 5 && players[i] GetAmmoCount( weap ) > 0)
  218. {
  219. if (level.player_ammo_low == 0)
  220. {
  221. level.player_ammo_low = 1;
  222. players[i] thread add_low_ammo_dialog();
  223. players[i] thread ammo_dialog_timer();
  224. level waittill("send_dialog_reminder");
  225. level.player_ammo_low = 0;
  226. }
  227.  
  228. }
  229. else if (players[i] GetAmmoCount( weap ) == 0)
  230. {
  231. if(!isDefined(weap) || weap == "none")
  232. {
  233. continue;
  234. }
  235. level.player_ammo_out = 1;
  236. players[i] thread add_no_ammo_dialog( weap );
  237. //put in this wait to keep the game from spamming about being low on ammo.
  238. wait(20);
  239. level.player_ammo_out = 0;
  240. }
  241. else
  242. {
  243. continue;
  244. }
  245. }
  246. wait(.5);
  247. }
  248. }
  249. ammo_dialog_timer()
  250. {
  251. level endon ("ammo_out");
  252. while(1)
  253. {
  254. wait(20);
  255. level notify ("send_dialog_reminder");
  256.  
  257. }
  258.  
  259. }
  260. add_low_ammo_dialog()
  261. {
  262. index = maps\_zombiemode_weapons::get_player_index(self);
  263. player_index = "plr_" + index + "_";
  264. if(!IsDefined (self.vox_ammo_low))
  265. {
  266. num_variants = maps\_zombiemode_spawner::get_number_variants(player_index + "vox_ammo_low");
  267. self.vox_ammo_low = [];
  268. for(i=0;i<num_variants;i++)
  269. {
  270. self.vox_ammo_low[self.vox_ammo_low.size] = "vox_ammo_low_" + i;
  271. }
  272. self.vox_ammo_low_available = self.vox_ammo_low;
  273. }
  274. sound_to_play = random(self.vox_ammo_low_available);
  275.  
  276. self.vox_ammo_low_available = array_remove(self.vox_ammo_low_available,sound_to_play);
  277.  
  278. if (self.vox_ammo_low_available.size < 1 )
  279. {
  280. self.vox_ammo_low_available = self.vox_ammo_low;
  281. }
  282.  
  283. self maps\_zombiemode_spawner::do_player_playdialog(player_index, sound_to_play, 0.25);
  284.  
  285.  
  286.  
  287. }
  288. add_no_ammo_dialog( weap )
  289. {
  290. self endon( "disconnect" );
  291.  
  292. // Let's pause here a couple of seconds to see if we're really out of ammo.
  293. // If you take a weapon, there's a second or two where your current weapon
  294. // will be set to no ammo while you switch to the new one.
  295. wait(2);
  296.  
  297. curr_weap = self getcurrentweapon();
  298. if ( !IsDefined(curr_weap) || curr_weap != weap || self GetAmmoCount( curr_weap ) != 0 )
  299. {
  300. // False alarm
  301. return;
  302. }
  303.  
  304.  
  305. index = maps\_zombiemode_weapons::get_player_index(self);
  306. player_index = "plr_" + index + "_";
  307. if(!IsDefined (self.vox_ammo_out))
  308. {
  309. num_variants = maps\_zombiemode_spawner::get_number_variants(player_index + "vox_ammo_out");
  310. self.vox_ammo_out = [];
  311. for(i=0;i<num_variants;i++)
  312. {
  313. self.vox_ammo_out[self.vox_ammo_out.size] = "vox_ammo_out_" + i;
  314. }
  315. self.vox_ammo_out_available = self.vox_ammo_out;
  316. }
  317. sound_to_play = random(self.vox_ammo_out_available);
  318.  
  319. self.vox_ammo_out_available = array_remove(self.vox_ammo_out_available,sound_to_play);
  320.  
  321. if (self.vox_ammo_out_available.size < 1 )
  322. {
  323. self.vox_ammo_out_available = self.vox_ammo_out;
  324. }
  325.  
  326. self maps\_zombiemode_spawner::do_player_playdialog(player_index, sound_to_play, 0.25);
  327.  
  328.  
  329.  
  330. }
  331. /*------------------------------------
  332. audio plays when more than 1 player connects
  333. ------------------------------------*/
  334. spawn_vo()
  335. {
  336. //not sure if we need this
  337. wait(1);
  338.  
  339. players = getplayers();
  340.  
  341. //just pick a random player for now and play some vo
  342. if(players.size > 1)
  343. {
  344. player = random(players);
  345. index = maps\_zombiemode_weapons::get_player_index(player);
  346. player thread spawn_vo_player(index,players.size);
  347. }
  348.  
  349. }
  350.  
  351. spawn_vo_player(index,num)
  352. {
  353. sound = "plr_" + index + "_vox_" + num +"play";
  354. self playsound(sound, "sound_done");
  355. self waittill("sound_done");
  356. }
  357.  
  358. testing_spawner_bug()
  359. {
  360. wait( 0.1 );
  361. level.round_number = 7;
  362.  
  363. spawners = [];
  364. spawners[0] = GetEnt( "testy", "targetname" );
  365. while( 1 )
  366. {
  367. wait( 1 );
  368. level.enemy_spawns = spawners;
  369. }
  370. }
  371.  
  372. precache_shaders()
  373. {
  374. PrecacheShader( "hud_chalk_1" );
  375. PrecacheShader( "hud_chalk_2" );
  376. PrecacheShader( "hud_chalk_3" );
  377. PrecacheShader( "hud_chalk_4" );
  378. PrecacheShader( "hud_chalk_5" );
  379. }
  380.  
  381. precache_models()
  382. {
  383. precachemodel( "char_ger_honorgd_zomb_behead" );
  384. precachemodel( "char_ger_zombieeye" );
  385. PrecacheModel( "tag_origin" );
  386. }
  387.  
  388. init_shellshocks()
  389. {
  390. level.player_killed_shellshock = "zombie_death";
  391. PrecacheShellshock( level.player_killed_shellshock );
  392. }
  393.  
  394. init_strings()
  395. {
  396. PrecacheString( &"ZOMBIE_WEAPONCOSTAMMO" );
  397. PrecacheString( &"ZOMBIE_ROUND" );
  398. PrecacheString( &"SCRIPT_PLUS" );
  399. PrecacheString( &"ZOMBIE_GAME_OVER" );
  400. PrecacheString( &"ZOMBIE_SURVIVED_ROUND" );
  401. PrecacheString( &"ZOMBIE_SURVIVED_ROUNDS" );
  402.  
  403. add_zombie_hint( "undefined", &"ZOMBIE_UNDEFINED" );
  404.  
  405. // Random Treasure Chest
  406. add_zombie_hint( "default_treasure_chest_950", &"ZOMBIE_RANDOM_WEAPON_950" );
  407.  
  408. // Barrier Pieces
  409. add_zombie_hint( "default_buy_barrier_piece_10", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_10" );
  410. add_zombie_hint( "default_buy_barrier_piece_20", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_20" );
  411. add_zombie_hint( "default_buy_barrier_piece_50", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_50" );
  412. add_zombie_hint( "default_buy_barrier_piece_100", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_100" );
  413.  
  414. // REWARD Barrier Pieces
  415. add_zombie_hint( "default_reward_barrier_piece", &"ZOMBIE_BUTTON_REWARD_BARRIER" );
  416. add_zombie_hint( "default_reward_barrier_piece_10", &"ZOMBIE_BUTTON_REWARD_BARRIER_10" );
  417. add_zombie_hint( "default_reward_barrier_piece_20", &"ZOMBIE_BUTTON_REWARD_BARRIER_20" );
  418. add_zombie_hint( "default_reward_barrier_piece_30", &"ZOMBIE_BUTTON_REWARD_BARRIER_30" );
  419. add_zombie_hint( "default_reward_barrier_piece_40", &"ZOMBIE_BUTTON_REWARD_BARRIER_40" );
  420. add_zombie_hint( "default_reward_barrier_piece_50", &"ZOMBIE_BUTTON_REWARD_BARRIER_50" );
  421.  
  422. // Debris
  423. add_zombie_hint( "default_buy_debris_100", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_100" );
  424. add_zombie_hint( "default_buy_debris_200", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_200" );
  425. add_zombie_hint( "default_buy_debris_250", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_250" );
  426. add_zombie_hint( "default_buy_debris_500", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_500" );
  427. add_zombie_hint( "default_buy_debris_750", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_750" );
  428. add_zombie_hint( "default_buy_debris_1000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1000" );
  429. add_zombie_hint( "default_buy_debris_1250", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1250" );
  430. add_zombie_hint( "default_buy_debris_1500", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1500" );
  431. add_zombie_hint( "default_buy_debris_1750", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1750" );
  432. add_zombie_hint( "default_buy_debris_2000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_2000" );
  433.  
  434. // Doors
  435. add_zombie_hint( "default_buy_door_100", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_100" );
  436. add_zombie_hint( "default_buy_door_200", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_200" );
  437. add_zombie_hint( "default_buy_door_250", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_250" );
  438. add_zombie_hint( "default_buy_door_500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_500" );
  439. add_zombie_hint( "default_buy_door_750", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_750" );
  440. add_zombie_hint( "default_buy_door_1000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1000" );
  441. add_zombie_hint( "default_buy_door_1250", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1250" );
  442. add_zombie_hint( "default_buy_door_1500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1500" );
  443. add_zombie_hint( "default_buy_door_1750", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1750" );
  444. add_zombie_hint( "default_buy_door_2000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_2000" );
  445.  
  446. // Areas
  447. add_zombie_hint( "default_buy_area_100", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_100" );
  448. add_zombie_hint( "default_buy_area_200", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_200" );
  449. add_zombie_hint( "default_buy_area_250", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_250" );
  450. add_zombie_hint( "default_buy_area_500", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_500" );
  451. add_zombie_hint( "default_buy_area_750", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_750" );
  452. add_zombie_hint( "default_buy_area_1000", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1000" );
  453. add_zombie_hint( "default_buy_area_1250", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1250" );
  454. add_zombie_hint( "default_buy_area_1500", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1500" );
  455. add_zombie_hint( "default_buy_area_1750", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1750" );
  456. add_zombie_hint( "default_buy_area_2000", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_2000" );
  457. }
  458.  
  459. init_sounds()
  460. {
  461. add_sound( "end_of_round", "round_over" );
  462. add_sound( "end_of_game", "mx_game_over" ); //Had to remove this and add a music state switch so that we can add other musical elements.
  463. add_sound( "chalk_one_up", "chalk" );
  464. add_sound( "purchase", "cha_ching" );
  465. add_sound( "no_purchase", "no_cha_ching" );
  466.  
  467. // Zombification
  468. // TODO need to vary these up
  469. add_sound( "playerzombie_usebutton_sound", "attack_vocals" );
  470. add_sound( "playerzombie_attackbutton_sound", "attack_vocals" );
  471. add_sound( "playerzombie_adsbutton_sound", "attack_vocals" );
  472.  
  473. // Head gib
  474. add_sound( "zombie_head_gib", "zombie_head_gib" );
  475.  
  476. // Blockers
  477. add_sound( "rebuild_barrier_piece", "repair_boards" );
  478. add_sound( "rebuild_barrier_hover", "boards_float" );
  479. add_sound( "debris_hover_loop", "couch_loop" );
  480. add_sound( "break_barrier_piece", "break_boards" );
  481. add_sound("blocker_end_move", "board_slam");
  482. add_sound( "barrier_rebuild_slam", "board_slam" );
  483.  
  484. // Doors
  485. add_sound( "door_slide_open", "door_slide_open" );
  486. add_sound( "door_rotate_open", "door_slide_open" );
  487.  
  488. // Debris
  489. add_sound( "debris_move", "weap_wall" );
  490.  
  491. // Random Weapon Chest
  492. add_sound( "open_chest", "lid_open" );
  493. add_sound( "music_chest", "music_box" );
  494. add_sound( "close_chest", "lid_close" );
  495.  
  496. // Weapons on walls
  497. add_sound( "weapon_show", "weap_wall" );
  498.  
  499. }
  500.  
  501. init_levelvars()
  502. {
  503. level.intermission = false;
  504. level.dog_intermission = false;
  505. level.zombie_total = 0;
  506. level.no_laststandmissionfail = true;
  507.  
  508. level.zombie_vars = [];
  509.  
  510. // Default to not zombify the player till further support
  511. set_zombie_var( "zombify_player", false );
  512.  
  513. set_zombie_var( "below_world_check", -1000 );
  514.  
  515. // Respawn in the spectators in between rounds
  516. set_zombie_var( "spectators_respawn", true );
  517.  
  518. // Round
  519. set_zombie_var( "zombie_use_failsafe", true );
  520. set_zombie_var( "zombie_round_time", 30 );
  521. set_zombie_var( "zombie_between_round_time", 10 );
  522. set_zombie_var( "zombie_intermission_time", 15 );
  523.  
  524. // Spawning
  525. set_zombie_var( "zombie_spawn_delay", 2 );
  526.  
  527.  
  528.  
  529. // AI
  530. set_zombie_var( "zombie_health_increase", 100 );
  531. set_zombie_var( "zombie_health_increase_percent", 10, 100 );
  532. set_zombie_var( "zombie_health_start", 150 );
  533. set_zombie_var( "zombie_max_ai", 24 );
  534. set_zombie_var( "zombie_ai_per_player", 6 );
  535.  
  536. // Scoring
  537. set_zombie_var( "zombie_score_start", 500 );
  538. /#
  539. if( GetDvarInt( "zombie_cheat" ) >= 1 )
  540. {
  541. set_zombie_var( "zombie_score_start", 100000 );
  542. }
  543. #/
  544. set_zombie_var( "zombie_score_kill", 50 );
  545. set_zombie_var( "zombie_score_damage", 5 );
  546. set_zombie_var( "zombie_score_bonus_melee", 80 );
  547. set_zombie_var( "zombie_score_bonus_head", 50 );
  548. set_zombie_var( "zombie_score_bonus_neck", 20 );
  549. set_zombie_var( "zombie_score_bonus_torso", 10 );
  550. set_zombie_var( "zombie_score_bonus_burn", 10 );
  551.  
  552. set_zombie_var( "penalty_no_revive_percent", 10, 100 );
  553. set_zombie_var( "penalty_died_percent", 0, 100 );
  554. set_zombie_var( "penalty_downed_percent", 5, 100 );
  555.  
  556. set_zombie_var( "zombie_flame_dmg_point_delay", 500 );
  557.  
  558. if ( IsSplitScreen() )
  559. {
  560. set_zombie_var( "zombie_timer_offset", 280 ); // hud offsets
  561. }
  562. }
  563.  
  564. init_dvars()
  565. {
  566. level.zombiemode = true;
  567.  
  568. //coder mod: tkeegan - new code dvar
  569. setSavedDvar( "zombiemode", "1" );
  570. SetDvar( "ui_gametype", "zom" );
  571. setSavedDvar( "fire_world_damage", "0" );
  572. setSavedDvar( "fire_world_damage_rate", "0" );
  573. setSavedDvar( "fire_world_damage_duration", "0" );
  574.  
  575. if( GetDvar( "zombie_debug" ) == "" )
  576. {
  577. SetDvar( "zombie_debug", "0" );
  578. }
  579.  
  580. if( GetDvar( "zombie_cheat" ) == "" )
  581. {
  582. SetDvar( "zombie_cheat", "0" );
  583. }
  584.  
  585. if(getdvar("magic_chest_movable") == "")
  586. {
  587. SetDvar( "magic_chest_movable", "1" );
  588. }
  589.  
  590. if(getdvar("magic_box_explore_only") == "")
  591. {
  592. SetDvar( "magic_box_explore_only", "1" );
  593. }
  594.  
  595. SetDvar( "revive_trigger_radius", "60" );
  596. }
  597.  
  598. initZombieLeaderboardData()
  599. {
  600. // Initializing Leaderboard Stat Variables
  601. level.zombieLeaderboardStatVariable["nazi_zombie_prototype"]["highestwave"] = "nz_prototype_highestwave";
  602. level.zombieLeaderboardStatVariable["nazi_zombie_prototype"]["timeinwave"] = "nz_prototype_timeinwave";
  603. level.zombieLeaderboardStatVariable["nazi_zombie_prototype"]["totalpoints"] = "nz_prototype_totalpoints";
  604.  
  605. level.zombieLeaderboardStatVariable["nazi_zombie_asylum"]["highestwave"] = "nz_asylum_highestwave";
  606. level.zombieLeaderboardStatVariable["nazi_zombie_asylum"]["timeinwave"] = "nz_asylum_timeinwave";
  607. level.zombieLeaderboardStatVariable["nazi_zombie_asylum"]["totalpoints"] = "nz_asylum_totalpoints";
  608.  
  609. level.zombieLeaderboardStatVariable["nazi_zombie_sumpf"]["highestwave"] = "nz_sumpf_highestwave";
  610. level.zombieLeaderboardStatVariable["nazi_zombie_sumpf"]["timeinwave"] = "nz_sumpf_timeinwave";
  611. level.zombieLeaderboardStatVariable["nazi_zombie_sumpf"]["totalpoints"] = "nz_sumpf_totalpoints";
  612.  
  613. level.zombieLeaderboardStatVariable["nazi_zombie_factory"]["highestwave"] = "nz_factory_highestwave";
  614. level.zombieLeaderboardStatVariable["nazi_zombie_factory"]["timeinwave"] = "nz_factory_timeinwave";
  615. level.zombieLeaderboardStatVariable["nazi_zombie_factory"]["totalpoints"] = "nz_factory_totalpoints";
  616.  
  617. // Initializing Leaderboard Number
  618. level.zombieLeaderboardNumber["nazi_zombie_prototype"]["waves"] = 13;
  619. level.zombieLeaderboardNumber["nazi_zombie_prototype"]["points"] = 14;
  620.  
  621. level.zombieLeaderboardNumber["nazi_zombie_asylum"]["waves"] = 15;
  622. level.zombieLeaderboardNumber["nazi_zombie_asylum"]["points"] = 16;
  623.  
  624. level.zombieLeaderboardNumber["nazi_zombie_sumpf"]["waves"] = 17;
  625. level.zombieLeaderboardNumber["nazi_zombie_sumpf"]["points"] = 18;
  626.  
  627. level.zombieLeaderboardNumber["nazi_zombie_factory"]["waves"] = 19;
  628. level.zombieLeaderboardNumber["nazi_zombie_factory"]["points"] = 20;
  629. }
  630.  
  631.  
  632. init_flags()
  633. {
  634. flag_init("spawn_point_override");
  635. flag_init("electricity_on");
  636. flag_init("crawler_round");
  637. }
  638.  
  639.  
  640. init_fx()
  641. {
  642. level._effect["wood_chunk_destory"] = loadfx( "impacts/large_woodhit" );
  643.  
  644. level._effect["edge_fog"] = LoadFx( "env/smoke/fx_fog_zombie_amb" );
  645. level._effect["chest_light"] = LoadFx( "env/light/fx_ray_sun_sm_short" );
  646.  
  647. level._effect["eye_glow"] = LoadFx( "misc/fx_zombie_eye_single" );
  648.  
  649. level._effect["zombie_grain"] = LoadFx( "misc/fx_zombie_grain_cloud" );
  650.  
  651. level._effect["headshot"] = LoadFX( "impacts/flesh_hit_head_fatal_lg_exit" );
  652. level._effect["headshot_nochunks"] = LoadFX( "misc/fx_zombie_bloodsplat" );
  653. level._effect["bloodspurt"] = LoadFX( "misc/fx_zombie_bloodspurt" );
  654. level._effect["tesla_head_light"] = Loadfx( "maps/zombie/fx_zombie_tesla_neck_spurt");
  655.  
  656. level._effect["rise_burst_water"] = LoadFx("maps/zombie/fx_zombie_body_wtr_burst");
  657. level._effect["rise_billow_water"] = LoadFx("maps/zombie/fx_zombie_body_wtr_billowing");
  658. level._effect["rise_dust_water"] = LoadFx("maps/zombie/fx_zombie_body_wtr_falling");
  659.  
  660. level._effect["rise_burst"] = LoadFx("maps/mp_maps/fx_mp_zombie_hand_dirt_burst");
  661. level._effect["rise_billow"] = LoadFx("maps/mp_maps/fx_mp_zombie_body_dirt_billowing");
  662. level._effect["rise_dust"] = LoadFx("maps/mp_maps/fx_mp_zombie_body_dust_falling");
  663.  
  664. // Flamethrower
  665. level._effect["character_fire_pain_sm"] = loadfx( "env/fire/fx_fire_player_sm_1sec" );
  666. level._effect["character_fire_death_sm"] = loadfx( "env/fire/fx_fire_player_md" );
  667. level._effect["character_fire_death_torso"] = loadfx( "env/fire/fx_fire_player_torso" );
  668. }
  669.  
  670. // zombie specific anims
  671.  
  672. init_standard_zombie_anims()
  673. {
  674. // deaths
  675. level.scr_anim["zombie"]["death1"] = %ai_zombie_death_v1;
  676. level.scr_anim["zombie"]["death2"] = %ai_zombie_death_v2;
  677. level.scr_anim["zombie"]["death3"] = %ai_zombie_crawl_death_v1;
  678. level.scr_anim["zombie"]["death4"] = %ai_zombie_crawl_death_v2;
  679.  
  680. // run cycles
  681.  
  682. level.scr_anim["zombie"]["walk1"] = %ai_zombie_walk_v1;
  683. level.scr_anim["zombie"]["walk2"] = %ai_zombie_walk_v2;
  684. level.scr_anim["zombie"]["walk3"] = %ai_zombie_walk_v3;
  685. level.scr_anim["zombie"]["walk4"] = %ai_zombie_walk_v4;
  686.  
  687. level.scr_anim["zombie"]["run1"] = %ai_zombie_walk_fast_v1;
  688. level.scr_anim["zombie"]["run2"] = %ai_zombie_walk_fast_v2;
  689. level.scr_anim["zombie"]["run3"] = %ai_zombie_walk_fast_v3;
  690. level.scr_anim["zombie"]["run4"] = %ai_zombie_run_v2;
  691. level.scr_anim["zombie"]["run5"] = %ai_zombie_run_v4;
  692. level.scr_anim["zombie"]["run6"] = %ai_zombie_run_v3;
  693. //level.scr_anim["zombie"]["run4"] = %ai_zombie_run_v1;
  694. //level.scr_anim["zombie"]["run6"] = %ai_zombie_run_v4;
  695.  
  696. level.scr_anim["zombie"]["sprint1"] = %ai_zombie_sprint_v1;
  697. level.scr_anim["zombie"]["sprint2"] = %ai_zombie_sprint_v2;
  698. level.scr_anim["zombie"]["sprint3"] = %ai_zombie_sprint_v1;
  699. level.scr_anim["zombie"]["sprint4"] = %ai_zombie_sprint_v2;
  700. //level.scr_anim["zombie"]["sprint3"] = %ai_zombie_sprint_v3;
  701. //level.scr_anim["zombie"]["sprint3"] = %ai_zombie_sprint_v4;
  702. //level.scr_anim["zombie"]["sprint4"] = %ai_zombie_sprint_v5;
  703.  
  704. // run cycles in prone
  705. level.scr_anim["zombie"]["crawl1"] = %ai_zombie_crawl;
  706. level.scr_anim["zombie"]["crawl2"] = %ai_zombie_crawl_v1;
  707. level.scr_anim["zombie"]["crawl3"] = %ai_zombie_crawl_v2;
  708. level.scr_anim["zombie"]["crawl4"] = %ai_zombie_crawl_v3;
  709. level.scr_anim["zombie"]["crawl5"] = %ai_zombie_crawl_v4;
  710. level.scr_anim["zombie"]["crawl6"] = %ai_zombie_crawl_v5;
  711. level.scr_anim["zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a;
  712. level.scr_anim["zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b;
  713.  
  714.  
  715.  
  716.  
  717. level.scr_anim["zombie"]["crawl_sprint1"] = %ai_zombie_crawl_sprint;
  718. level.scr_anim["zombie"]["crawl_sprint2"] = %ai_zombie_crawl_sprint_1;
  719. level.scr_anim["zombie"]["crawl_sprint3"] = %ai_zombie_crawl_sprint_2;
  720.  
  721. if( !isDefined( level._zombie_melee ) )
  722. {
  723. level._zombie_melee = [];
  724. }
  725. if( !isDefined( level._zombie_walk_melee ) )
  726. {
  727. level._zombie_walk_melee = [];
  728. }
  729. if( !isDefined( level._zombie_run_melee ) )
  730. {
  731. level._zombie_run_melee = [];
  732. }
  733.  
  734. level._zombie_melee["zombie"] = [];
  735. level._zombie_walk_melee["zombie"] = [];
  736. level._zombie_run_melee["zombie"] = [];
  737.  
  738. level._zombie_melee["zombie"][0] = %ai_zombie_attack_forward_v1;
  739. level._zombie_melee["zombie"][1] = %ai_zombie_attack_forward_v2;
  740. level._zombie_melee["zombie"][2] = %ai_zombie_attack_v1;
  741. level._zombie_melee["zombie"][3] = %ai_zombie_attack_v2;
  742. level._zombie_melee["zombie"][4] = %ai_zombie_attack_v1;
  743. level._zombie_melee["zombie"][5] = %ai_zombie_attack_v4;
  744. level._zombie_melee["zombie"][6] = %ai_zombie_attack_v6;
  745. level._zombie_run_melee["zombie"][0] = %ai_zombie_run_attack_v1;
  746. level._zombie_run_melee["zombie"][1] = %ai_zombie_run_attack_v2;
  747. level._zombie_run_melee["zombie"][2] = %ai_zombie_run_attack_v3;
  748. level.scr_anim["zombie"]["walk5"] = %ai_zombie_walk_v6;
  749. level.scr_anim["zombie"]["walk6"] = %ai_zombie_walk_v7;
  750. level.scr_anim["zombie"]["walk7"] = %ai_zombie_walk_v8;
  751. level.scr_anim["zombie"]["walk8"] = %ai_zombie_walk_v9;
  752.  
  753. if( isDefined( level.zombie_anim_override ) )
  754. {
  755. [[ level.zombie_anim_override ]]();
  756. }
  757.  
  758. level._zombie_walk_melee["zombie"][0] = %ai_zombie_walk_attack_v1;
  759. level._zombie_walk_melee["zombie"][1] = %ai_zombie_walk_attack_v2;
  760. level._zombie_walk_melee["zombie"][2] = %ai_zombie_walk_attack_v3;
  761. level._zombie_walk_melee["zombie"][3] = %ai_zombie_walk_attack_v4;
  762.  
  763. // melee in crawl
  764. if( !isDefined( level._zombie_melee_crawl ) )
  765. {
  766. level._zombie_melee_crawl = [];
  767. }
  768. level._zombie_melee_crawl["zombie"] = [];
  769. level._zombie_melee_crawl["zombie"][0] = %ai_zombie_attack_crawl;
  770. level._zombie_melee_crawl["zombie"][1] = %ai_zombie_attack_crawl_lunge;
  771.  
  772. if( !isDefined( level._zombie_stumpy_melee ) )
  773. {
  774. level._zombie_stumpy_melee = [];
  775. }
  776. level._zombie_stumpy_melee["zombie"] = [];
  777. level._zombie_stumpy_melee["zombie"][0] = %ai_zombie_walk_on_hands_shot_a;
  778. level._zombie_stumpy_melee["zombie"][1] = %ai_zombie_walk_on_hands_shot_b;
  779. //level._zombie_melee_crawl["zombie"][2] = %ai_zombie_crawl_attack_A;
  780.  
  781. // tesla deaths
  782. if( !isDefined( level._zombie_tesla_death ) )
  783. {
  784. level._zombie_tesla_death = [];
  785. }
  786. level._zombie_tesla_death["zombie"] = [];
  787. level._zombie_tesla_death["zombie"][0] = %ai_zombie_tesla_death_a;
  788. level._zombie_tesla_death["zombie"][1] = %ai_zombie_tesla_death_b;
  789. level._zombie_tesla_death["zombie"][2] = %ai_zombie_tesla_death_c;
  790. level._zombie_tesla_death["zombie"][3] = %ai_zombie_tesla_death_d;
  791. level._zombie_tesla_death["zombie"][4] = %ai_zombie_tesla_death_e;
  792.  
  793. if( !isDefined( level._zombie_tesla_crawl_death ) )
  794. {
  795. level._zombie_tesla_crawl_death = [];
  796. }
  797. level._zombie_tesla_crawl_death["zombie"] = [];
  798. level._zombie_tesla_crawl_death["zombie"][0] = %ai_zombie_tesla_crawl_death_a;
  799. level._zombie_tesla_crawl_death["zombie"][1] = %ai_zombie_tesla_crawl_death_b;
  800.  
  801. // deaths
  802. if( !isDefined( level._zombie_deaths ) )
  803. {
  804. level._zombie_deaths = [];
  805. }
  806. level._zombie_deaths["zombie"] = [];
  807. level._zombie_deaths["zombie"][0] = %ch_dazed_a_death;
  808. level._zombie_deaths["zombie"][1] = %ch_dazed_b_death;
  809. level._zombie_deaths["zombie"][2] = %ch_dazed_c_death;
  810. level._zombie_deaths["zombie"][3] = %ch_dazed_d_death;
  811.  
  812. /*
  813. ground crawl
  814. */
  815.  
  816. if( !isDefined( level._zombie_rise_anims ) )
  817. {
  818. level._zombie_rise_anims = [];
  819. }
  820.  
  821. // set up the arrays
  822. level._zombie_rise_anims["zombie"] = [];
  823.  
  824. //level._zombie_rise_anims["zombie"][1]["walk"][0] = %ai_zombie_traverse_ground_v1_crawl;
  825. level._zombie_rise_anims["zombie"][1]["walk"][0] = %ai_zombie_traverse_ground_v1_walk;
  826.  
  827. //level._zombie_rise_anims["zombie"][1]["run"][0] = %ai_zombie_traverse_ground_v1_crawlfast;
  828. level._zombie_rise_anims["zombie"][1]["run"][0] = %ai_zombie_traverse_ground_v1_run;
  829.  
  830. level._zombie_rise_anims["zombie"][1]["sprint"][0] = %ai_zombie_traverse_ground_climbout_fast;
  831.  
  832. //level._zombie_rise_anims["zombie"][2]["walk"][0] = %ai_zombie_traverse_ground_v2_walk; //!broken
  833. level._zombie_rise_anims["zombie"][2]["walk"][0] = %ai_zombie_traverse_ground_v2_walk_altA;
  834. //level._zombie_rise_anims["zombie"][2]["walk"][2] = %ai_zombie_traverse_ground_v2_walk_altB;//!broken
  835.  
  836. // ground crawl death
  837. if( !isDefined( level._zombie_rise_death_anims ) )
  838. {
  839. level._zombie_rise_death_anims = [];
  840. }
  841.  
  842. level._zombie_rise_death_anims["zombie"] = [];
  843.  
  844. level._zombie_rise_death_anims["zombie"][1]["in"][0] = %ai_zombie_traverse_ground_v1_deathinside;
  845. level._zombie_rise_death_anims["zombie"][1]["in"][1] = %ai_zombie_traverse_ground_v1_deathinside_alt;
  846.  
  847. level._zombie_rise_death_anims["zombie"][1]["out"][0] = %ai_zombie_traverse_ground_v1_deathoutside;
  848. level._zombie_rise_death_anims["zombie"][1]["out"][1] = %ai_zombie_traverse_ground_v1_deathoutside_alt;
  849.  
  850. level._zombie_rise_death_anims["zombie"][2]["in"][0] = %ai_zombie_traverse_ground_v2_death_low;
  851. level._zombie_rise_death_anims["zombie"][2]["in"][1] = %ai_zombie_traverse_ground_v2_death_low_alt;
  852.  
  853. level._zombie_rise_death_anims["zombie"][2]["out"][0] = %ai_zombie_traverse_ground_v2_death_high;
  854. level._zombie_rise_death_anims["zombie"][2]["out"][1] = %ai_zombie_traverse_ground_v2_death_high_alt;
  855.  
  856. //taunts
  857. if( !isDefined( level._zombie_run_taunt ) )
  858. {
  859. level._zombie_run_taunt = [];
  860. }
  861. if( !isDefined( level._zombie_board_taunt ) )
  862. {
  863. level._zombie_board_taunt = [];
  864. }
  865. level._zombie_run_taunt["zombie"] = [];
  866. level._zombie_board_taunt["zombie"] = [];
  867.  
  868. //level._zombie_taunt["zombie"][0] = %ai_zombie_taunts_1;
  869. //level._zombie_taunt["zombie"][1] = %ai_zombie_taunts_4;
  870. //level._zombie_taunt["zombie"][2] = %ai_zombie_taunts_5b;
  871. //level._zombie_taunt["zombie"][3] = %ai_zombie_taunts_5c;
  872. //level._zombie_taunt["zombie"][4] = %ai_zombie_taunts_5d;
  873. //level._zombie_taunt["zombie"][5] = %ai_zombie_taunts_5e;
  874. //level._zombie_taunt["zombie"][6] = %ai_zombie_taunts_5f;
  875. //level._zombie_taunt["zombie"][7] = %ai_zombie_taunts_7;
  876. //level._zombie_taunt["zombie"][8] = %ai_zombie_taunts_9;
  877. //level._zombie_taunt["zombie"][8] = %ai_zombie_taunts_11;
  878. //level._zombie_taunt["zombie"][8] = %ai_zombie_taunts_12;
  879.  
  880. level._zombie_board_taunt["zombie"][0] = %ai_zombie_taunts_4;
  881. level._zombie_board_taunt["zombie"][1] = %ai_zombie_taunts_7;
  882. level._zombie_board_taunt["zombie"][2] = %ai_zombie_taunts_9;
  883. level._zombie_board_taunt["zombie"][3] = %ai_zombie_taunts_5b;
  884. level._zombie_board_taunt["zombie"][4] = %ai_zombie_taunts_5c;
  885. level._zombie_board_taunt["zombie"][5] = %ai_zombie_taunts_5d;
  886. level._zombie_board_taunt["zombie"][6] = %ai_zombie_taunts_5e;
  887. level._zombie_board_taunt["zombie"][7] = %ai_zombie_taunts_5f;
  888. }
  889.  
  890. init_anims()
  891. {
  892. init_standard_zombie_anims();
  893. }
  894.  
  895. // Initialize any animscript related variables
  896. init_animscripts()
  897. {
  898. // Setup the animscripts, then override them (we call this just incase an AI has not yet spawned)
  899. animscripts\init::firstInit();
  900.  
  901. anim.idleAnimArray ["stand"] = [];
  902. anim.idleAnimWeights ["stand"] = [];
  903. anim.idleAnimArray ["stand"][0][0] = %ai_zombie_idle_v1_delta;
  904. anim.idleAnimWeights ["stand"][0][0] = 10;
  905.  
  906. anim.idleAnimArray ["crouch"] = [];
  907. anim.idleAnimWeights ["crouch"] = [];
  908. anim.idleAnimArray ["crouch"][0][0] = %ai_zombie_idle_crawl_delta;
  909. anim.idleAnimWeights ["crouch"][0][0] = 10;
  910. }
  911.  
  912. // Handles the intro screen
  913. zombie_intro_screen( string1, string2, string3, string4, string5 )
  914. {
  915. flag_wait( "all_players_connected" );
  916.  
  917. wait( 1 );
  918.  
  919. //TUEY Set music state to Splash Screencompass
  920. setmusicstate( "SPLASH_SCREEN" );
  921. wait (0.2);
  922. //TUEY Set music state to WAVE_1
  923. // setmusicstate("WAVE_1");
  924. }
  925.  
  926. players_playing()
  927. {
  928. // initialize level.players_playing
  929. players = get_players();
  930. level.players_playing = players.size;
  931.  
  932. wait( 20 );
  933.  
  934. players = get_players();
  935. level.players_playing = players.size;
  936. }
  937.  
  938. //
  939. // NETWORK SECTION ====================================================================== //
  940. //
  941.  
  942. watchGrenadeThrow()
  943. {
  944. self endon( "disconnect" );
  945. self endon( "death" );
  946.  
  947. while(1)
  948. {
  949. self waittill("grenade_fire", grenade);
  950.  
  951. if(isdefined(grenade))
  952. {
  953. if(self maps\_laststand::player_is_in_laststand())
  954. {
  955. grenade delete();
  956. }
  957. }
  958. }
  959. }
  960.  
  961. onPlayerConnect()
  962. {
  963. for( ;; )
  964. {
  965. level waittill( "connecting", player );
  966.  
  967. player.entity_num = player GetEntityNumber();
  968. player thread onPlayerSpawned();
  969. player thread onPlayerDisconnect();
  970. player thread player_revive_monitor();
  971.  
  972. //player thread watchGrenadeThrow();
  973.  
  974. player.score = level.zombie_vars["zombie_score_start"];
  975. player.score_total = player.score;
  976. player.old_score = player.score;
  977.  
  978. player.is_zombie = false;
  979. player.initialized = false;
  980. player.zombification_time = 0;
  981. }
  982. }
  983.  
  984. onPlayerConnect_clientDvars()
  985. {
  986. self SetClientDvars( "cg_deadChatWithDead", "1",
  987. "cg_deadChatWithTeam", "1",
  988. "cg_deadHearTeamLiving", "1",
  989. "cg_deadHearAllLiving", "1",
  990. "cg_everyoneHearsEveryone", "1",
  991. "compass", "0",
  992. "hud_showStance", "0",
  993. "cg_thirdPerson", "0",
  994. "cg_fov", "65",
  995. "cg_thirdPersonAngle", "0",
  996. "ammoCounterHide", "0",
  997. "miniscoreboardhide", "0",
  998. "ui_hud_hardcore", "0" );
  999.  
  1000. self SetDepthOfField( 0, 0, 512, 4000, 4, 0 );
  1001. }
  1002.  
  1003. onPlayerDisconnect()
  1004. {
  1005. self waittill( "disconnect" );
  1006. self remove_from_spectate_list();
  1007. }
  1008.  
  1009. onPlayerSpawned()
  1010. {
  1011. self endon( "disconnect" );
  1012.  
  1013. for( ;; )
  1014. {
  1015. self waittill( "spawned_player" );
  1016.  
  1017.  
  1018.  
  1019. self SetClientDvars( "cg_thirdPerson", "0",
  1020. "cg_fov", "65",
  1021. "cg_thirdPersonAngle", "0" );
  1022.  
  1023. self SetDepthOfField( 0, 0, 512, 4000, 4, 0 );
  1024.  
  1025. self add_to_spectate_list();
  1026.  
  1027. if( isdefined( self.initialized ) )
  1028. {
  1029. if( self.initialized == false )
  1030. {
  1031. self.initialized = true;
  1032. // self maps\_zombiemode_score::create_player_score_hud();
  1033.  
  1034. // set the initial score on the hud
  1035. self maps\_zombiemode_score::set_player_score_hud( true );
  1036. self thread player_zombie_breadcrumb();
  1037.  
  1038. //Init stat tracking variables
  1039. self.stats["kills"] = 0;
  1040. self.stats["score"] = 0;
  1041. self.stats["downs"] = 0;
  1042. self.stats["revives"] = 0;
  1043. self.stats["perks"] = 0;
  1044. self.stats["headshots"] = 0;
  1045. self.stats["zombie_gibs"] = 0;
  1046. }
  1047. }
  1048. }
  1049. }
  1050.  
  1051.  
  1052. //
  1053. // Keep track of players going down and getting revived
  1054. player_revive_monitor()
  1055. {
  1056. self endon( "disconnect" );
  1057.  
  1058. while (1)
  1059. {
  1060. self waittill( "player_revived", reviver );
  1061.  
  1062. if ( IsDefined(reviver) )
  1063. {
  1064. // Check to see how much money you lost from being down.
  1065. points = self.score_lost_when_downed;
  1066. if ( points > 300 )
  1067. {
  1068. points = 300;
  1069. }
  1070. reviver maps\_zombiemode_score::add_to_player_score( points );
  1071. self.score_lost_when_downed = 0;
  1072. }
  1073. }
  1074. }
  1075.  
  1076.  
  1077. player_laststand()
  1078. {
  1079. self maps\_zombiemode_score::player_downed_penalty();
  1080.  
  1081. if( IsDefined( self.intermission ) && self.intermission )
  1082. {
  1083. maps\_challenges_coop::doMissionCallback( "playerDied", self );
  1084.  
  1085. level waittill( "forever" );
  1086. }
  1087. }
  1088.  
  1089. spawnSpectator()
  1090. {
  1091. self endon( "disconnect" );
  1092. self endon( "spawned_spectator" );
  1093. self notify( "spawned" );
  1094. self notify( "end_respawn" );
  1095.  
  1096. if( level.intermission )
  1097. {
  1098. return;
  1099. }
  1100.  
  1101. if( IsDefined( level.no_spectator ) && level.no_spectator )
  1102. {
  1103. wait( 3 );
  1104. ExitLevel();
  1105. }
  1106.  
  1107. // The check_for_level_end looks for this
  1108. self.is_zombie = true;
  1109.  
  1110. // Remove all reviving abilities
  1111. self notify ( "zombified" );
  1112.  
  1113. if( IsDefined( self.revivetrigger ) )
  1114. {
  1115. self.revivetrigger delete();
  1116. self.revivetrigger = undefined;
  1117. }
  1118.  
  1119. self.zombification_time = getTime(); //set time when player died
  1120.  
  1121. resetTimeout();
  1122.  
  1123. // Stop shellshock and rumble
  1124. self StopShellshock();
  1125. self StopRumble( "damage_heavy" );
  1126.  
  1127. self.sessionstate = "spectator";
  1128. self.spectatorclient = -1;
  1129.  
  1130. self remove_from_spectate_list();
  1131.  
  1132. self.maxhealth = self.health;
  1133. self.shellshocked = false;
  1134. self.inWater = false;
  1135. self.friendlydamage = undefined;
  1136. self.hasSpawned = true;
  1137. self.spawnTime = getTime();
  1138. self.afk = false;
  1139.  
  1140. println( "*************************Zombie Spectator***" );
  1141. self detachAll();
  1142.  
  1143. self setSpectatePermissions( true );
  1144. self thread spectator_thread();
  1145.  
  1146. self Spawn( self.origin, self.angles );
  1147. self notify( "spawned_spectator" );
  1148. }
  1149.  
  1150. setSpectatePermissions( isOn )
  1151. {
  1152. self AllowSpectateTeam( "allies", isOn );
  1153. self AllowSpectateTeam( "axis", false );
  1154. self AllowSpectateTeam( "freelook", false );
  1155. self AllowSpectateTeam( "none", false );
  1156. }
  1157.  
  1158. spectator_thread()
  1159. {
  1160. self endon( "disconnect" );
  1161. self endon( "spawned_player" );
  1162.  
  1163. if( IsSplitScreen() )
  1164. {
  1165. last_alive = undefined;
  1166. players = get_players();
  1167.  
  1168. for( i = 0; i < players.size; i++ )
  1169. {
  1170. if( !players[i].is_zombie )
  1171. {
  1172. last_alive = players[i];
  1173. }
  1174. }
  1175.  
  1176. share_screen( last_alive, true );
  1177.  
  1178. return;
  1179. }
  1180.  
  1181. self thread spectator_toggle_3rd_person();
  1182. }
  1183.  
  1184. spectator_toggle_3rd_person()
  1185. {
  1186. self endon( "disconnect" );
  1187. self endon( "spawned_player" );
  1188.  
  1189. third_person = true;
  1190. self set_third_person( true );
  1191. // self NotifyOnCommand( "toggle_3rd_person", "weapnext" );
  1192.  
  1193. // while( 1 )
  1194. // {
  1195. // self waittill( "toggle_3rd_person" );
  1196. //
  1197. // if( third_person )
  1198. // {
  1199. // third_person = false;
  1200. // self set_third_person( false );
  1201. // wait( 0.5 );
  1202. // }
  1203. // else
  1204. // {
  1205. // third_person = true;
  1206. // self set_third_person( true );
  1207. // wait( 0.5 );
  1208. // }
  1209. // }
  1210. }
  1211.  
  1212.  
  1213. set_third_person( value )
  1214. {
  1215. if( value )
  1216. {
  1217. self SetClientDvars( "cg_thirdPerson", "1",
  1218. "cg_fov", "40",
  1219. "cg_thirdPersonAngle", "354" );
  1220.  
  1221. self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
  1222. }
  1223. else
  1224. {
  1225. self SetClientDvars( "cg_thirdPerson", "0",
  1226. "cg_fov", "65",
  1227. "cg_thirdPersonAngle", "0" );
  1228.  
  1229. self setDepthOfField( 0, 0, 512, 4000, 4, 0 );
  1230. }
  1231. }
  1232.  
  1233. spectators_respawn()
  1234. {
  1235. level endon( "between_round_over" );
  1236.  
  1237. if( !IsDefined( level.zombie_vars["spectators_respawn"] ) || !level.zombie_vars["spectators_respawn"] )
  1238. {
  1239. return;
  1240. }
  1241.  
  1242. if( !IsDefined( level.custom_spawnPlayer ) )
  1243. {
  1244. // Custom spawn call for when they respawn from spectator
  1245. level.custom_spawnPlayer = ::spectator_respawn;
  1246. }
  1247.  
  1248. while( 1 )
  1249. {
  1250. players = get_players();
  1251. for( i = 0; i < players.size; i++ )
  1252. {
  1253. if( players[i].sessionstate == "spectator" )
  1254. {
  1255. players[i] [[level.spawnPlayer]]();
  1256. if( isDefined( players[i].has_altmelee ) && players[i].has_altmelee )
  1257. {
  1258. players[i] SetPerk( "specialty_altmelee" );
  1259. }
  1260. if (isDefined(level.script) && level.round_number > 6 && players[i].score < 1500)
  1261. {
  1262. players[i].old_score = players[i].score;
  1263. players[i].score = 1500;
  1264. players[i] maps\_zombiemode_score::set_player_score_hud();
  1265. }
  1266. }
  1267. }
  1268.  
  1269. wait( 1 );
  1270. }
  1271. }
  1272.  
  1273. spectator_respawn()
  1274. {
  1275. println( "*************************Respawn Spectator***" );
  1276. assert( IsDefined( self.spectator_respawn ) );
  1277.  
  1278. origin = self.spectator_respawn.origin;
  1279. angles = self.spectator_respawn.angles;
  1280.  
  1281. self setSpectatePermissions( false );
  1282.  
  1283. new_origin = undefined;
  1284.  
  1285.  
  1286. new_origin = check_for_valid_spawn_near_team( self );
  1287.  
  1288.  
  1289. if( IsDefined( new_origin ) )
  1290. {
  1291. self Spawn( new_origin, angles );
  1292. }
  1293. else
  1294. {
  1295. self Spawn( origin, angles );
  1296. }
  1297.  
  1298.  
  1299. if( IsSplitScreen() )
  1300. {
  1301. last_alive = undefined;
  1302. players = get_players();
  1303.  
  1304. for( i = 0; i < players.size; i++ )
  1305. {
  1306. if( !players[i].is_zombie )
  1307. {
  1308. last_alive = players[i];
  1309. }
  1310. }
  1311.  
  1312. share_screen( last_alive, false );
  1313. }
  1314.  
  1315. self.has_betties = undefined;
  1316. self.is_burning = undefined;
  1317.  
  1318. // The check_for_level_end looks for this
  1319. self.is_zombie = false;
  1320. self.ignoreme = false;
  1321.  
  1322. setClientSysState("lsm", "0", self); // Notify client last stand ended.
  1323. self RevivePlayer();
  1324.  
  1325. self notify( "spawned_player" );
  1326.  
  1327. // Penalize the player when we respawn, since he 'died'
  1328. self maps\_zombiemode_score::player_reduce_points( "died" );
  1329.  
  1330. self thread player_zombie_breadcrumb();
  1331.  
  1332. return true;
  1333. }
  1334.  
  1335. check_for_valid_spawn_near_team( revivee )
  1336. {
  1337.  
  1338. players = get_players();
  1339. spawn_points = getstructarray("player_respawn_point", "targetname");
  1340.  
  1341. if( spawn_points.size == 0 )
  1342. return undefined;
  1343.  
  1344. for( i = 0; i < players.size; i++ )
  1345. {
  1346. if( is_player_valid( players[i] ) )
  1347. {
  1348. for( j = 0 ; j < spawn_points.size; j++ )
  1349. {
  1350. if( DistanceSquared( players[i].origin, spawn_points[j].origin ) < ( 1000 * 1000 ) && spawn_points[j].locked == false )
  1351. {
  1352. spawn_array = getstructarray( spawn_points[j].target, "targetname" );
  1353.  
  1354. for( k = 0; k < spawn_array.size; k++ )
  1355. {
  1356. if( spawn_array[k].script_int == (revivee.entity_num + 1) )
  1357. {
  1358. return spawn_array[k].origin;
  1359. }
  1360. }
  1361.  
  1362. return spawn_array[0].origin;
  1363. }
  1364.  
  1365. }
  1366.  
  1367. }
  1368.  
  1369. }
  1370.  
  1371. return undefined;
  1372.  
  1373. }
  1374.  
  1375.  
  1376. get_players_on_team(exclude)
  1377. {
  1378.  
  1379. teammates = [];
  1380.  
  1381. players = get_players();
  1382. for(i=0;i<players.size;i++)
  1383. {
  1384. //check to see if other players on your team are alive and not waiting to be revived
  1385. if(players[i].spawn_side == self.spawn_side && !isDefined(players[i].revivetrigger) && players[i] != exclude )
  1386. {
  1387. teammates[teammates.size] = players[i];
  1388. }
  1389. }
  1390.  
  1391. return teammates;
  1392. }
  1393.  
  1394.  
  1395.  
  1396. get_safe_breadcrumb_pos( player )
  1397. {
  1398. players = get_players();
  1399. valid_players = [];
  1400.  
  1401. min_dist = 150 * 150;
  1402. for( i = 0; i < players.size; i++ )
  1403. {
  1404. if( !is_player_valid( players[i] ) )
  1405. {
  1406. continue;
  1407. }
  1408.  
  1409. valid_players[valid_players.size] = players[i];
  1410. }
  1411.  
  1412. for( i = 0; i < valid_players.size; i++ )
  1413. {
  1414. count = 0;
  1415. for( q = 1; q < player.zombie_breadcrumbs.size; q++ )
  1416. {
  1417. if( DistanceSquared( player.zombie_breadcrumbs[q], valid_players[i].origin ) < min_dist )
  1418. {
  1419. continue;
  1420. }
  1421.  
  1422. count++;
  1423. if( count == valid_players.size )
  1424. {
  1425. return player.zombie_breadcrumbs[q];
  1426. }
  1427. }
  1428. }
  1429.  
  1430. return undefined;
  1431. }
  1432.  
  1433. round_spawning()
  1434. {
  1435. level endon( "intermission" );
  1436. /#
  1437. level endon( "kill_round" );
  1438. #/
  1439.  
  1440. if( level.intermission )
  1441. {
  1442. return;
  1443. }
  1444.  
  1445. if( level.enemy_spawns.size < 1 )
  1446. {
  1447. ASSERTMSG( "No spawners with targetname zombie_spawner in map." );
  1448. return;
  1449. }
  1450.  
  1451. /#
  1452. if ( GetDVarInt( "zombie_cheat" ) == 2 || GetDVarInt( "zombie_cheat" ) >= 4 )
  1453. {
  1454. return;
  1455. }
  1456. #/
  1457.  
  1458. ai_calculate_health();
  1459.  
  1460. count = 0;
  1461.  
  1462. //CODER MOD: TOMMY K
  1463. players = get_players();
  1464. for( i = 0; i < players.size; i++ )
  1465. {
  1466. players[i].zombification_time = 0;
  1467. }
  1468.  
  1469. max = level.zombie_vars["zombie_max_ai"];
  1470.  
  1471. multiplier = level.round_number / 5;
  1472. if( multiplier < 1 )
  1473. {
  1474. multiplier = 1;
  1475. }
  1476.  
  1477. // After round 10, exponentially have more AI attack the player
  1478. if( level.round_number >= 10 )
  1479. {
  1480. multiplier *= level.round_number * 0.15;
  1481. }
  1482.  
  1483. player_num = get_players().size;
  1484.  
  1485. if( player_num == 1 )
  1486. {
  1487. max += int( ( 0.5 * level.zombie_vars["zombie_ai_per_player"] ) * multiplier );
  1488. }
  1489. else
  1490. {
  1491. max += int( ( ( player_num - 1 ) * level.zombie_vars["zombie_ai_per_player"] ) * multiplier );
  1492. }
  1493.  
  1494.  
  1495.  
  1496. if(level.round_number < 3 && level.script == "nazi_zombie_asylum")
  1497. {
  1498. if(get_players().size > 1)
  1499. {
  1500.  
  1501. max = get_players().size * 3 + level.round_number;
  1502.  
  1503. }
  1504. else
  1505. {
  1506.  
  1507. max = 6;
  1508.  
  1509. }
  1510. }
  1511. else if ( level.first_round )
  1512. {
  1513. max = int( max * 0.2 );
  1514. }
  1515. else if (level.round_number < 3)
  1516. {
  1517. max = int( max * 0.4 );
  1518. }
  1519. else if (level.round_number < 4)
  1520. {
  1521. max = int( max * 0.6 );
  1522. }
  1523. else if (level.round_number < 5)
  1524. {
  1525. max = int( max * 0.8 );
  1526. }
  1527.  
  1528.  
  1529. level.zombie_total = max;
  1530. mixed_spawns = 0; // Number of mixed spawns this round. Currently means number of dogs in a mixed round
  1531.  
  1532. // DEBUG HACK:
  1533. //max = 1;
  1534. old_spawn = undefined;
  1535. while( count < max )
  1536. {
  1537.  
  1538. spawn_point = level.enemy_spawns[RandomInt( level.enemy_spawns.size )];
  1539.  
  1540. if( !IsDefined( old_spawn ) )
  1541. {
  1542. old_spawn = spawn_point;
  1543. }
  1544. else if( Spawn_point == old_spawn )
  1545. {
  1546. spawn_point = level.enemy_spawns[RandomInt( level.enemy_spawns.size )];
  1547. }
  1548. old_spawn = spawn_point;
  1549.  
  1550. // iPrintLn(spawn_point.targetname + " " + level.zombie_vars["zombie_spawn_delay"]);
  1551. while( get_enemy_count() > 31 )
  1552. {
  1553. wait( 0.05 );
  1554. }
  1555.  
  1556. // MM Mix in dog spawns...
  1557. if ( IsDefined( level.mixed_rounds_enabled ) && level.mixed_rounds_enabled == 1 )
  1558. {
  1559. spawn_dog = false;
  1560. if ( level.round_number > 30 )
  1561. {
  1562. if ( RandomInt(100) < 3 )
  1563. {
  1564. spawn_dog = true;
  1565. }
  1566. }
  1567. else if ( level.round_number > 25 && mixed_spawns < 3 )
  1568. {
  1569. if ( RandomInt(100) < 2 )
  1570. {
  1571. spawn_dog = true;
  1572. }
  1573. }
  1574. else if ( level.round_number > 20 && mixed_spawns < 2 )
  1575. {
  1576. if ( RandomInt(100) < 2 )
  1577. {
  1578. spawn_dog = true;
  1579. }
  1580. }
  1581. else if ( level.round_number > 15 && mixed_spawns < 1 )
  1582. {
  1583. if ( RandomInt(100) < 1 )
  1584. {
  1585. spawn_dog = true;
  1586. }
  1587. }
  1588.  
  1589. if ( spawn_dog )
  1590. {
  1591. keys = GetArrayKeys( level.zones );
  1592. for ( i=0; i<keys.size; i++ )
  1593. {
  1594. if ( level.zones[ keys[i] ].is_occupied )
  1595. {
  1596. akeys = GetArrayKeys( level.zones[ keys[i] ].adjacent_zones );
  1597. for ( k=0; k<akeys.size; k++ )
  1598. {
  1599. if ( level.zones[ akeys[k] ].is_active &&
  1600. !level.zones[ akeys[k] ].is_occupied &&
  1601. level.zones[ akeys[k] ].dog_locations.size > 0 )
  1602. {
  1603. maps\_zombiemode_dogs::special_dog_spawn( undefined, 1 );
  1604. level.zombie_total--;
  1605. wait_network_frame();
  1606. }
  1607. }
  1608. }
  1609. }
  1610. }
  1611. }
  1612.  
  1613. ai = spawn_zombie( spawn_point );
  1614. if( IsDefined( ai ) )
  1615. {
  1616. level.zombie_total--;
  1617. ai thread round_spawn_failsafe();
  1618. count++;
  1619. }
  1620. wait( level.zombie_vars["zombie_spawn_delay"] );
  1621. wait_network_frame();
  1622. }
  1623.  
  1624. if( level.round_number > 3 )
  1625. {
  1626. zombies = getaiarray( "axis" );
  1627. while( zombies.size > 0 )
  1628. {
  1629. if( zombies.size == 1 && zombies[0].has_legs == true )
  1630. {
  1631. var = randomintrange(1, 4);
  1632. zombies[0] set_run_anim( "sprint" + var );
  1633. zombies[0].run_combatanim = level.scr_anim[zombies[0].animname]["sprint" + var];
  1634. }
  1635. wait(0.5);
  1636. zombies = getaiarray("axis");
  1637. }
  1638.  
  1639. }
  1640.  
  1641. }
  1642.  
  1643. // TESTING: spawn one zombie at a time
  1644. round_spawning_test()
  1645. {
  1646. while (true)
  1647. {
  1648. spawn_point = level.enemy_spawns[RandomInt( level.enemy_spawns.size )]; // grab a random spawner
  1649.  
  1650. ai = spawn_zombie( spawn_point );
  1651. ai waittill("death");
  1652.  
  1653. wait 5;
  1654. }
  1655. }
  1656. /////////////////////////////////////////////////////////
  1657.  
  1658. round_text( text )
  1659. {
  1660. if( level.first_round )
  1661. {
  1662. intro = true;
  1663. }
  1664. else
  1665. {
  1666. intro = false;
  1667. }
  1668.  
  1669. hud = create_simple_hud();
  1670. hud.horzAlign = "center";
  1671. hud.vertAlign = "middle";
  1672. hud.alignX = "center";
  1673. hud.alignY = "middle";
  1674. hud.y = -100;
  1675. hud.foreground = 1;
  1676. hud.fontscale = 16.0;
  1677. hud.alpha = 0;
  1678. hud.color = ( 1, 1, 1 );
  1679.  
  1680. hud SetText( text );
  1681. hud FadeOverTime( 1.5 );
  1682. hud.alpha = 1;
  1683. wait( 1.5 );
  1684.  
  1685. if( intro )
  1686. {
  1687. wait( 1 );
  1688. level notify( "intro_change_color" );
  1689. }
  1690.  
  1691. hud FadeOverTime( 3 );
  1692. //hud.color = ( 0.8, 0, 0 );
  1693. hud.color = ( 0.423, 0.004, 0 );
  1694. wait( 3 );
  1695.  
  1696. if( intro )
  1697. {
  1698. level waittill( "intro_hud_done" );
  1699. }
  1700.  
  1701. hud FadeOverTime( 1.5 );
  1702. hud.alpha = 0;
  1703. wait( 1.5 );
  1704. hud destroy();
  1705. }
  1706.  
  1707. round_start()
  1708. {
  1709. level.zombie_health = level.zombie_vars["zombie_health_start"];
  1710. level.round_number = 1;
  1711. level.first_round = true;
  1712.  
  1713. // so players get init'ed with grenades
  1714. players = get_players();
  1715. for (i = 0; i < players.size; i++)
  1716. {
  1717. players[i] giveweapon( "stielhandgranate" );
  1718. players[i] setweaponammoclip( "stielhandgranate", 0);
  1719. }
  1720.  
  1721. level.chalk_hud1 = create_chalk_hud();
  1722. level.chalk_hud2 = create_chalk_hud( 64 );
  1723.  
  1724. // level waittill( "introscreen_done" );
  1725.  
  1726. level.round_spawn_func = ::round_spawning;
  1727.  
  1728. /#
  1729. if (GetDVarInt("zombie_rise_test"))
  1730. {
  1731. level.round_spawn_func = ::round_spawning_test; // FOR TESTING, one zombie at a time, no round advancement
  1732. }
  1733. #/
  1734.  
  1735. level thread round_think();
  1736. }
  1737.  
  1738.  
  1739. create_chalk_hud( x )
  1740. {
  1741. if( !IsDefined( x ) )
  1742. {
  1743. x = 0;
  1744. }
  1745.  
  1746. hud = create_simple_hud();
  1747. hud.alignX = "left";
  1748. hud.alignY = "bottom";
  1749. hud.horzAlign = "left";
  1750. hud.vertAlign = "bottom";
  1751. hud.color = ( 0.423, 0.004, 0 );
  1752. hud.x = x;
  1753. hud.alpha = 0;
  1754.  
  1755. hud SetShader( "hud_chalk_1", 64, 64 );
  1756.  
  1757. return hud;
  1758. }
  1759. play_intro_VO()
  1760. {
  1761.  
  1762. wait(3);
  1763. players = getplayers();
  1764. for(i=0;i<players.size;i++)
  1765. {
  1766. index = maps\_zombiemode_weapons::get_player_index(players[i]);
  1767. player_index = "plr_" + index + "_";
  1768. sound_to_play = "vox_name_int_0";
  1769. players[i] maps\_zombiemode_spawner::do_player_playdialog(player_index, sound_to_play, 0.05);
  1770. wait(0.7);
  1771. }
  1772.  
  1773. //Plays a random start line on one of the characters
  1774. // i = randomintrange(0,players.size);
  1775. // players[i] playsound ("plr_" + i + "_vox_start" + "_" + randomintrange(0, variation_count));
  1776.  
  1777. }
  1778.  
  1779. //
  1780. // Let's the players know that you need power to open these
  1781. play_door_dialog()
  1782. {
  1783. level endon( "electricity_on" );
  1784. self endon ("warning_dialog");
  1785. timer = 0;
  1786.  
  1787. while(1)
  1788. {
  1789. wait(0.05);
  1790. players = get_players();
  1791. for(i = 0; i < players.size; i++)
  1792. {
  1793. dist = distancesquared(players[i].origin, self.origin );
  1794. if(dist > 70*70)
  1795. {
  1796. timer =0;
  1797. continue;
  1798. }
  1799. while(dist < 70*70 && timer < 3)
  1800. {
  1801. wait(0.5);
  1802. timer++;
  1803. }
  1804. if(dist > 70*70 && timer >= 3)
  1805. {
  1806. self playsound("door_deny");
  1807. players[i] thread do_player_vo("vox_start", 5);
  1808. wait(3);
  1809. self notify ("warning_dialog");
  1810. //iprintlnbold("warning_given");
  1811. }
  1812. }
  1813. }
  1814. }
  1815.  
  1816. wait_until_first_player()
  1817. {
  1818. players = get_players();
  1819. if( !IsDefined( players[0] ) )
  1820. {
  1821. level waittill( "first_player_ready" );
  1822. }
  1823. }
  1824. chalk_one_up()
  1825. {
  1826.  
  1827. if(!IsDefined(level.doground_nomusic))
  1828. {
  1829. level.doground_nomusic = 0;
  1830. }
  1831. if( level.first_round )
  1832. {
  1833. intro = true;
  1834. //Play the intro sound at the beginning of the round
  1835. //level thread play_intro_VO(); (commented out for Corky)
  1836.  
  1837. }
  1838. else
  1839. {
  1840. intro = false;
  1841. }
  1842.  
  1843. round = undefined;
  1844. if( intro )
  1845. {
  1846. round = create_simple_hud();
  1847. round.alignX = "center";
  1848. round.alignY = "bottom";
  1849. round.horzAlign = "center";
  1850. round.vertAlign = "bottom";
  1851. round.fontscale = 16;
  1852. round.color = ( 1, 1, 1 );
  1853. round.x = 0;
  1854. round.y = -265;
  1855. round.alpha = 0;
  1856. round SetText( &"ZOMBIE_ROUND" );
  1857.  
  1858. round FadeOverTime( 1 );
  1859. round.alpha = 1;
  1860. wait( 1 );
  1861.  
  1862. round FadeOverTime( 3 );
  1863. // round.color = ( 0.8, 0, 0 );
  1864. round.color = ( 0.423, 0.004, 0 );
  1865. }
  1866.  
  1867. hud = undefined;
  1868. if( level.round_number < 6 || level.round_number > 10 )
  1869. {
  1870. hud = level.chalk_hud1;
  1871. hud.fontscale = 32;
  1872. }
  1873. else if( level.round_number < 11 )
  1874. {
  1875. hud = level.chalk_hud2;
  1876. }
  1877.  
  1878. if( intro )
  1879. {
  1880. hud.alpha = 0;
  1881. hud.horzAlign = "center";
  1882. hud.x = -5;
  1883. hud.y = -200;
  1884. }
  1885.  
  1886. hud FadeOverTime( 0.5 );
  1887. hud.alpha = 0;
  1888.  
  1889. if( level.round_number == 11 && IsDefined( level.chalk_hud2 ) )
  1890. {
  1891. level.chalk_hud2 FadeOverTime( 0.5 );
  1892. level.chalk_hud2.alpha = 0;
  1893. }
  1894.  
  1895. wait( 0.5 );
  1896.  
  1897. // play_sound_at_pos( "chalk_one_up", ( 0, 0, 0 ) );
  1898.  
  1899. if(IsDefined(level.eggs) && level.eggs !=1 )
  1900. {
  1901. if(level.doground_nomusic ==0 )
  1902. {
  1903. setmusicstate("round_begin");
  1904. }
  1905.  
  1906. }
  1907.  
  1908. if( level.round_number == 11 && IsDefined( level.chalk_hud2 ) )
  1909. {
  1910. level.chalk_hud2 destroy_hud();
  1911. }
  1912.  
  1913. if( level.round_number > 10 )
  1914. {
  1915. hud SetValue( level.round_number );
  1916. }
  1917.  
  1918. hud FadeOverTime( 0.5 );
  1919. hud.alpha = 1;
  1920.  
  1921. if( intro )
  1922. {
  1923. wait( 3 );
  1924.  
  1925. if( IsDefined( round ) )
  1926. {
  1927. round FadeOverTime( 1 );
  1928. round.alpha = 0;
  1929. }
  1930.  
  1931. wait( 0.25 );
  1932.  
  1933. level notify( "intro_hud_done" );
  1934. hud MoveOverTime( 1.75 );
  1935. hud.horzAlign = "left";
  1936. // hud.x = 0;
  1937. hud.y = 0;
  1938. wait( 2 );
  1939.  
  1940. round destroy_hud();
  1941. }
  1942.  
  1943. if( level.round_number > 10 )
  1944. {
  1945. }
  1946. else if( level.round_number > 5 )
  1947. {
  1948. hud SetShader( "hud_chalk_" + ( level.round_number - 5 ), 64, 64 );
  1949. }
  1950. else if( level.round_number > 1 )
  1951. {
  1952. hud SetShader( "hud_chalk_" + level.round_number, 64, 64 );
  1953. }
  1954. /*
  1955. else
  1956. {
  1957. setmusicstate("WAVE_1");
  1958. }
  1959. */
  1960.  
  1961. // ReportMTU(level.round_number); // In network debug instrumented builds, causes network spike report to generate.
  1962. }
  1963.  
  1964.  
  1965. chalk_round_hint()
  1966. {
  1967. huds = [];
  1968. huds[huds.size] = level.chalk_hud1;
  1969.  
  1970. if( level.round_number > 5 && level.round_number < 11 )
  1971. {
  1972. huds[huds.size] = level.chalk_hud2;
  1973. }
  1974.  
  1975. time = level.zombie_vars["zombie_between_round_time"];
  1976. for( i = 0; i < huds.size; i++ )
  1977. {
  1978. huds[i] FadeOverTime( time * 0.25 );
  1979. huds[i].color = ( 1, 1, 1 );
  1980. }
  1981. if(IsDefined(level.eggs) && level.eggs !=1)
  1982. {
  1983. if(IsDefined(level.doground_nomusic && level.doground_nomusic == 0 ))
  1984. {
  1985. setmusicstate("round_end");
  1986. wait( time * 0.25 );
  1987. }
  1988. else if(IsDefined(level.doground_nomusic && level.doground_nomusic == 1 ))
  1989. {
  1990. play_sound_2D( "bright_sting" );
  1991.  
  1992. }
  1993. }
  1994. // play_sound_at_pos( "end_of_round", ( 0, 0, 0 ) );
  1995.  
  1996.  
  1997.  
  1998. // Pulse
  1999. fade_time = 0.5;
  2000. steps = ( time * 0.5 ) / fade_time;
  2001. for( q = 0; q < steps; q++ )
  2002. {
  2003. for( i = 0; i < huds.size; i++ )
  2004. {
  2005. if( !IsDefined( huds[i] ) )
  2006. {
  2007. continue;
  2008. }
  2009.  
  2010. huds[i] FadeOverTime( fade_time );
  2011. huds[i].alpha = 0;
  2012. }
  2013.  
  2014. wait( fade_time );
  2015.  
  2016. for( i = 0; i < huds.size; i++ )
  2017. {
  2018. if( !IsDefined( huds[i] ) )
  2019. {
  2020. continue;
  2021. }
  2022.  
  2023. huds[i] FadeOverTime( fade_time );
  2024. huds[i].alpha = 1;
  2025. }
  2026.  
  2027. wait( fade_time );
  2028. }
  2029.  
  2030. for( i = 0; i < huds.size; i++ )
  2031. {
  2032. if( !IsDefined( huds[i] ) )
  2033. {
  2034. continue;
  2035. }
  2036.  
  2037. huds[i] FadeOverTime( time * 0.25 );
  2038. // huds[i].color = ( 0.8, 0, 0 );
  2039. huds[i].color = ( 0.423, 0.004, 0 );
  2040. huds[i].alpha = 1;
  2041. }
  2042. }
  2043.  
  2044. round_think()
  2045. {
  2046. for( ;; )
  2047. {
  2048. //////////////////////////////////////////
  2049. //designed by prod DT#36173
  2050. maxreward = 50 * level.round_number;
  2051. if ( maxreward > 500 )
  2052. maxreward = 500;
  2053. level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward;
  2054. //////////////////////////////////////////
  2055.  
  2056. level.round_timer = level.zombie_vars["zombie_round_time"];
  2057.  
  2058. add_later_round_spawners();
  2059.  
  2060. chalk_one_up();
  2061. // round_text( &"ZOMBIE_ROUND_BEGIN" );
  2062.  
  2063. maps\_zombiemode_powerups::powerup_round_start();
  2064.  
  2065. players = get_players();
  2066. array_thread( players, maps\_zombiemode_blockers_new::rebuild_barrier_reward_reset );
  2067.  
  2068. level thread award_grenades_for_survivors();
  2069.  
  2070. bbPrint( "zombie_rounds: round %d player_count %d", level.round_number, players.size );
  2071.  
  2072. level.round_start_time = getTime();
  2073. level thread [[level.round_spawn_func]]();
  2074.  
  2075. round_wait();
  2076. level.first_round = false;
  2077.  
  2078. level thread spectators_respawn();
  2079.  
  2080. // round_text( &"ZOMBIE_ROUND_END" );
  2081. level thread chalk_round_hint();
  2082.  
  2083. wait( level.zombie_vars["zombie_between_round_time"] );
  2084.  
  2085. // here's the difficulty increase over time area
  2086. timer = level.zombie_vars["zombie_spawn_delay"];
  2087.  
  2088. if( timer < 0.08 )
  2089. {
  2090. timer = 0.08;
  2091. }
  2092.  
  2093. level.zombie_vars["zombie_spawn_delay"] = timer * 0.95;
  2094.  
  2095. // Increase the zombie move speed
  2096. level.zombie_move_speed = level.round_number * 8;
  2097.  
  2098. level.round_number++;
  2099.  
  2100. level notify( "between_round_over" );
  2101. }
  2102. }
  2103.  
  2104.  
  2105. award_grenades_for_survivors()
  2106. {
  2107. players = get_players();
  2108.  
  2109. for (i = 0; i < players.size; i++)
  2110. {
  2111. if (!players[i].is_zombie)
  2112. {
  2113. if( !players[i] HasWeapon( "stielhandgranate" ) )
  2114. {
  2115. players[i] GiveWeapon( "stielhandgranate" );
  2116. players[i] SetWeaponAmmoClip( "stielhandgranate", 0 );
  2117. }
  2118.  
  2119. if ( players[i] GetFractionMaxAmmo( "stielhandgranate") < .25 )
  2120. {
  2121. players[i] SetWeaponAmmoClip( "stielhandgranate", 2 );
  2122. }
  2123. else if (players[i] GetFractionMaxAmmo( "stielhandgranate") < .5 )
  2124. {
  2125. players[i] SetWeaponAmmoClip( "stielhandgranate", 3 );
  2126. }
  2127. else
  2128. {
  2129. players[i] SetWeaponAmmoClip( "stielhandgranate", 4 );
  2130. }
  2131. }
  2132. }
  2133. }
  2134.  
  2135. ai_calculate_health()
  2136. {
  2137. // After round 10, get exponentially harder
  2138. if( level.round_number >= 10 )
  2139. {
  2140. level.zombie_health += Int( level.zombie_health * level.zombie_vars["zombie_health_increase_percent"] );
  2141. return;
  2142. }
  2143.  
  2144. if( level.round_number > 1 )
  2145. {
  2146. level.zombie_health = Int( level.zombie_health + level.zombie_vars["zombie_health_increase"] );
  2147. }
  2148.  
  2149. }
  2150.  
  2151. //put the conditions in here which should
  2152. //cause the failsafe to reset
  2153. round_spawn_failsafe()
  2154. {
  2155. self endon("death");//guy just died
  2156.  
  2157. //////////////////////////////////////////////////////////////
  2158. //FAILSAFE "hack shit" DT#33203
  2159. //////////////////////////////////////////////////////////////
  2160. prevorigin = self.origin;
  2161. while(1)
  2162. {
  2163. if( !level.zombie_vars["zombie_use_failsafe"] )
  2164. {
  2165. return;
  2166. }
  2167.  
  2168. wait( 30 );
  2169.  
  2170. //if i've torn a board down in the last 5 seconds, just
  2171. //wait 30 again.
  2172. if ( isDefined(self.lastchunk_destroy_time) )
  2173. {
  2174. if ( (getTime() - self.lastchunk_destroy_time) < 5000 )
  2175. continue;
  2176. }
  2177.  
  2178. //fell out of world
  2179. if ( self.origin[2] < level.zombie_vars["below_world_check"] )
  2180. {
  2181. self dodamage( self.health + 100, (0,0,0) );
  2182. break;
  2183. }
  2184.  
  2185. //hasnt moved 24 inches in 30 seconds?
  2186. if ( DistanceSquared( self.origin, prevorigin ) < 576 )
  2187. {
  2188. // DEBUG HACK
  2189. self dodamage( self.health + 100, (0,0,0) );
  2190. break;
  2191. }
  2192.  
  2193. prevorigin = self.origin;
  2194. }
  2195. //////////////////////////////////////////////////////////////
  2196. //END OF FAILSAFE "hack shit"
  2197. //////////////////////////////////////////////////////////////
  2198. }
  2199.  
  2200. // Waits for the time and the ai to die
  2201. round_wait()
  2202. {
  2203. /#
  2204. if (GetDVarInt("zombie_rise_test"))
  2205. {
  2206. level waittill("forever"); // TESTING: don't advance rounds
  2207. }
  2208. #/
  2209.  
  2210. /#
  2211. if ( GetDVarInt( "zombie_cheat" ) == 2 || GetDVarInt( "zombie_cheat" ) >= 4 )
  2212. {
  2213. level waittill("forever");
  2214. }
  2215. #/
  2216.  
  2217. wait( 1 );
  2218.  
  2219. if( flag("dog_round" ) )
  2220. {
  2221. wait(7);
  2222. while( level.dog_intermission )
  2223. {
  2224. wait(0.5);
  2225. }
  2226. }
  2227. else
  2228. {
  2229. while( get_enemy_count() > 0 || level.zombie_total > 0 || level.intermission)
  2230. {
  2231. wait( 0.5 );
  2232. }
  2233. }
  2234. }
  2235.  
  2236.  
  2237. zombify_player()
  2238. {
  2239. self maps\_zombiemode_score::player_died_penalty();
  2240.  
  2241. if( !IsDefined( level.zombie_vars["zombify_player"] ) || !level.zombie_vars["zombify_player"] )
  2242. {
  2243. self thread spawnSpectator();
  2244. return;
  2245. }
  2246.  
  2247. self.ignoreme = true;
  2248. self.is_zombie = true;
  2249. self.zombification_time = getTime();
  2250.  
  2251. self.team = "axis";
  2252. self notify( "zombified" );
  2253.  
  2254. if( IsDefined( self.revivetrigger ) )
  2255. {
  2256. self.revivetrigger Delete();
  2257. }
  2258. self.revivetrigger = undefined;
  2259.  
  2260. self setMoveSpeedScale( 0.3 );
  2261. self reviveplayer();
  2262.  
  2263. self TakeAllWeapons();
  2264. self starttanning();
  2265. self GiveWeapon( "zombie_melee", 0 );
  2266. self SwitchToWeapon( "zombie_melee" );
  2267. self DisableWeaponCycling();
  2268. self DisableOffhandWeapons();
  2269. self VisionSetNaked( "zombie_turned", 1 );
  2270.  
  2271. maps\_utility::setClientSysState( "zombify", 1, self ); // Zombie grain goooo
  2272.  
  2273. self thread maps\_zombiemode_spawner::zombie_eye_glow();
  2274.  
  2275. // set up the ground ref ent
  2276. self thread injured_walk();
  2277. // allow for zombie attacks, but they lose points?
  2278.  
  2279. self thread playerzombie_player_damage();
  2280. self thread playerzombie_soundboard();
  2281. }
  2282.  
  2283. playerzombie_player_damage()
  2284. {
  2285. self endon( "death" );
  2286. self endon( "disconnect" );
  2287.  
  2288. self thread playerzombie_infinite_health(); // manually keep regular health up
  2289. self.zombiehealth = level.zombie_health;
  2290.  
  2291. // enable PVP damage on this guy
  2292. // self EnablePvPDamage();
  2293.  
  2294. while( 1 )
  2295. {
  2296. self waittill( "damage", amount, attacker, directionVec, point, type );
  2297.  
  2298. if( !IsDefined( attacker ) || !IsPlayer( attacker ) )
  2299. {
  2300. wait( 0.05 );
  2301. continue;
  2302. }
  2303.  
  2304. self.zombiehealth -= amount;
  2305.  
  2306. if( self.zombiehealth <= 0 )
  2307. {
  2308. // "down" the zombie
  2309. self thread playerzombie_downed_state();
  2310. self waittill( "playerzombie_downed_state_done" );
  2311. self.zombiehealth = level.zombie_health;
  2312. }
  2313. }
  2314. }
  2315.  
  2316. playerzombie_downed_state()
  2317. {
  2318. self endon( "death" );
  2319. self endon( "disconnect" );
  2320.  
  2321. downTime = 15;
  2322.  
  2323. startTime = GetTime();
  2324. endTime = startTime +( downTime * 1000 );
  2325.  
  2326. self thread playerzombie_downed_hud();
  2327.  
  2328. self.playerzombie_soundboard_disable = true;
  2329. self thread maps\_zombiemode_spawner::zombie_eye_glow_stop();
  2330. self DisableWeapons();
  2331. self AllowStand( false );
  2332. self AllowCrouch( false );
  2333. self AllowProne( true );
  2334.  
  2335. while( GetTime() < endTime )
  2336. {
  2337. wait( 0.05 );
  2338. }
  2339.  
  2340. self.playerzombie_soundboard_disable = false;
  2341. self thread maps\_zombiemode_spawner::zombie_eye_glow();
  2342. self EnableWeapons();
  2343. self AllowStand( true );
  2344. self AllowCrouch( false );
  2345. self AllowProne( false );
  2346.  
  2347. self notify( "playerzombie_downed_state_done" );
  2348. }
  2349.  
  2350. playerzombie_downed_hud()
  2351. {
  2352. self endon( "death" );
  2353. self endon( "disconnect" );
  2354.  
  2355. text = NewClientHudElem( self );
  2356. text.alignX = "center";
  2357. text.alignY = "middle";
  2358. text.horzAlign = "center";
  2359. text.vertAlign = "bottom";
  2360. text.foreground = true;
  2361. text.font = "default";
  2362. text.fontScale = 1.8;
  2363. text.alpha = 0;
  2364. text.color = ( 1.0, 1.0, 1.0 );
  2365. text SetText( &"ZOMBIE_PLAYERZOMBIE_DOWNED" );
  2366.  
  2367. text.y = -113;
  2368. if( IsSplitScreen() )
  2369. {
  2370. text.y = -137;
  2371. }
  2372.  
  2373. text FadeOverTime( 0.1 );
  2374. text.alpha = 1;
  2375.  
  2376. self waittill( "playerzombie_downed_state_done" );
  2377.  
  2378. text FadeOverTime( 0.1 );
  2379. text.alpha = 0;
  2380. }
  2381.  
  2382. playerzombie_infinite_health()
  2383. {
  2384. self endon( "death" );
  2385. self endon( "disconnect" );
  2386.  
  2387. bighealth = 100000;
  2388.  
  2389. while( 1 )
  2390. {
  2391. if( self.health < bighealth )
  2392. {
  2393. self.health = bighealth;
  2394. }
  2395.  
  2396. wait( 0.1 );
  2397. }
  2398. }
  2399.  
  2400. playerzombie_soundboard()
  2401. {
  2402. self endon( "death" );
  2403. self endon( "disconnect" );
  2404.  
  2405. self.playerzombie_soundboard_disable = false;
  2406.  
  2407. self.buttonpressed_use = false;
  2408. self.buttonpressed_attack = false;
  2409. self.buttonpressed_ads = false;
  2410.  
  2411. self.useSound_waitTime = 3 * 1000; // milliseconds
  2412. self.useSound_nextTime = GetTime();
  2413. useSound = "playerzombie_usebutton_sound";
  2414.  
  2415. self.attackSound_waitTime = 3 * 1000;
  2416. self.attackSound_nextTime = GetTime();
  2417. attackSound = "playerzombie_attackbutton_sound";
  2418.  
  2419. self.adsSound_waitTime = 3 * 1000;
  2420. self.adsSound_nextTime = GetTime();
  2421. adsSound = "playerzombie_adsbutton_sound";
  2422.  
  2423. self.inputSound_nextTime = GetTime(); // don't want to be able to do all sounds at once
  2424.  
  2425. while( 1 )
  2426. {
  2427. if( self.playerzombie_soundboard_disable )
  2428. {
  2429. wait( 0.05 );
  2430. continue;
  2431. }
  2432.  
  2433. if( self UseButtonPressed() )
  2434. {
  2435. if( self can_do_input( "use" ) )
  2436. {
  2437. self thread playerzombie_play_sound( useSound );
  2438. self thread playerzombie_waitfor_buttonrelease( "use" );
  2439. self.useSound_nextTime = GetTime() + self.useSound_waitTime;
  2440. }
  2441. }
  2442. else if( self AttackButtonPressed() )
  2443. {
  2444. if( self can_do_input( "attack" ) )
  2445. {
  2446. self thread playerzombie_play_sound( attackSound );
  2447. self thread playerzombie_waitfor_buttonrelease( "attack" );
  2448. self.attackSound_nextTime = GetTime() + self.attackSound_waitTime;
  2449. }
  2450. }
  2451. else if( self AdsButtonPressed() )
  2452. {
  2453. if( self can_do_input( "ads" ) )
  2454. {
  2455. self thread playerzombie_play_sound( adsSound );
  2456. self thread playerzombie_waitfor_buttonrelease( "ads" );
  2457. self.adsSound_nextTime = GetTime() + self.adsSound_waitTime;
  2458. }
  2459. }
  2460.  
  2461. wait( 0.05 );
  2462. }
  2463. }
  2464.  
  2465. can_do_input( inputType )
  2466. {
  2467. if( GetTime() < self.inputSound_nextTime )
  2468. {
  2469. return false;
  2470. }
  2471.  
  2472. canDo = false;
  2473.  
  2474. switch( inputType )
  2475. {
  2476. case "use":
  2477. if( GetTime() >= self.useSound_nextTime && !self.buttonpressed_use )
  2478. {
  2479. canDo = true;
  2480. }
  2481. break;
  2482.  
  2483. case "attack":
  2484. if( GetTime() >= self.attackSound_nextTime && !self.buttonpressed_attack )
  2485. {
  2486. canDo = true;
  2487. }
  2488. break;
  2489.  
  2490. case "ads":
  2491. if( GetTime() >= self.useSound_nextTime && !self.buttonpressed_ads )
  2492. {
  2493. canDo = true;
  2494. }
  2495. break;
  2496.  
  2497. default:
  2498. ASSERTMSG( "can_do_input(): didn't recognize inputType of " + inputType );
  2499. break;
  2500. }
  2501.  
  2502. return canDo;
  2503. }
  2504.  
  2505. playerzombie_play_sound( alias )
  2506. {
  2507. self play_sound_on_ent( alias );
  2508. }
  2509.  
  2510. playerzombie_waitfor_buttonrelease( inputType )
  2511. {
  2512. if( inputType != "use" && inputType != "attack" && inputType != "ads" )
  2513. {
  2514. ASSERTMSG( "playerzombie_waitfor_buttonrelease(): inputType of " + inputType + " is not recognized." );
  2515. return;
  2516. }
  2517.  
  2518. notifyString = "waitfor_buttonrelease_" + inputType;
  2519. self notify( notifyString );
  2520. self endon( notifyString );
  2521.  
  2522. if( inputType == "use" )
  2523. {
  2524. self.buttonpressed_use = true;
  2525. while( self UseButtonPressed() )
  2526. {
  2527. wait( 0.05 );
  2528. }
  2529. self.buttonpressed_use = false;
  2530. }
  2531.  
  2532. else if( inputType == "attack" )
  2533. {
  2534. self.buttonpressed_attack = true;
  2535. while( self AttackButtonPressed() )
  2536. {
  2537. wait( 0.05 );
  2538. }
  2539. self.buttonpressed_attack = false;
  2540. }
  2541.  
  2542. else if( inputType == "ads" )
  2543. {
  2544. self.buttonpressed_ads = true;
  2545. while( self AdsButtonPressed() )
  2546. {
  2547. wait( 0.05 );
  2548. }
  2549. self.buttonpressed_ads = false;
  2550. }
  2551. }
  2552.  
  2553. remove_ignore_attacker()
  2554. {
  2555. self notify( "new_ignore_attacker" );
  2556. self endon( "new_ignore_attacker" );
  2557. self endon( "disconnect" );
  2558.  
  2559. if( !isDefined( level.ignore_enemy_timer ) )
  2560. {
  2561. level.ignore_enemy_timer = 0.4;
  2562. }
  2563.  
  2564. wait( level.ignore_enemy_timer );
  2565.  
  2566. self.ignoreAttacker = undefined;
  2567. }
  2568.  
  2569. player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
  2570. {
  2571. /*
  2572. if(self hasperk("specialty_armorvest") && eAttacker != self)
  2573. {
  2574. iDamage = iDamage * 0.75;
  2575. iprintlnbold(idamage);
  2576. }*/
  2577.  
  2578. if( sMeansOfDeath == "MOD_FALLING" )
  2579. {
  2580. sMeansOfDeath = "MOD_EXPLOSIVE";
  2581. }
  2582.  
  2583. if( isDefined( eAttacker ) )
  2584. {
  2585. if( isDefined( self.ignoreAttacker ) && self.ignoreAttacker == eAttacker )
  2586. {
  2587. return;
  2588. }
  2589.  
  2590. if( isDefined( eAttacker.is_zombie ) && eAttacker.is_zombie )
  2591. {
  2592. self.ignoreAttacker = eAttacker;
  2593. self thread remove_ignore_attacker();
  2594. }
  2595.  
  2596. if( isDefined( eAttacker.damage_mult ) )
  2597. {
  2598. iDamage *= eAttacker.damage_mult;
  2599. }
  2600. eAttacker notify( "hit_player" );
  2601. }
  2602. finalDamage = iDamage;
  2603.  
  2604. if( sMeansOfDeath == "MOD_PROJECTILE" || sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" )
  2605. {
  2606. if( self.health > 75 )
  2607. {
  2608. finalDamage = 75;
  2609. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2610. return;
  2611. }
  2612. }
  2613.  
  2614. if( iDamage < self.health )
  2615. {
  2616. if ( IsDefined( eAttacker ) )
  2617. {
  2618. eAttacker.sound_damage_player = self;
  2619. }
  2620.  
  2621. //iprintlnbold(iDamage);
  2622. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2623. return;
  2624. }
  2625. if( level.intermission )
  2626. {
  2627. level waittill( "forever" );
  2628. }
  2629.  
  2630. players = get_players();
  2631. count = 0;
  2632. for( i = 0; i < players.size; i++ )
  2633. {
  2634. if( players[i] == self || players[i].is_zombie || players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator" )
  2635. {
  2636. count++;
  2637. }
  2638. }
  2639.  
  2640. if( count < players.size )
  2641. {
  2642. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2643. return;
  2644. }
  2645.  
  2646. self.intermission = true;
  2647.  
  2648. self thread maps\_laststand::PlayerLastStand( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime );
  2649. self player_fake_death();
  2650.  
  2651. if( count == players.size )
  2652. {
  2653. level notify( "end_game" );
  2654. }
  2655. else
  2656. {
  2657. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2658. }
  2659. }
  2660.  
  2661. end_game()
  2662. {
  2663. level waittill ( "end_game" );
  2664.  
  2665. level.intermission = true;
  2666.  
  2667. update_leaderboards();
  2668.  
  2669. game_over = NewHudElem( self );
  2670. game_over.alignX = "center";
  2671. game_over.alignY = "middle";
  2672. game_over.horzAlign = "center";
  2673. game_over.vertAlign = "middle";
  2674. game_over.y -= 10;
  2675. game_over.foreground = true;
  2676. game_over.fontScale = 3;
  2677. game_over.alpha = 0;
  2678. game_over.color = ( 1.0, 1.0, 1.0 );
  2679. game_over SetText( &"ZOMBIE_GAME_OVER" );
  2680.  
  2681. game_over FadeOverTime( 1 );
  2682. game_over.alpha = 1;
  2683.  
  2684. survived = NewHudElem( self );
  2685. survived.alignX = "center";
  2686. survived.alignY = "middle";
  2687. survived.horzAlign = "center";
  2688. survived.vertAlign = "middle";
  2689. survived.y += 20;
  2690. survived.foreground = true;
  2691. survived.fontScale = 2;
  2692. survived.alpha = 0;
  2693. survived.color = ( 1.0, 1.0, 1.0 );
  2694.  
  2695. if( level.round_number < 2 )
  2696. {
  2697. survived SetText( &"ZOMBIE_SURVIVED_ROUND" );
  2698. }
  2699. else
  2700. {
  2701. survived SetText( &"ZOMBIE_SURVIVED_ROUNDS", level.round_number );
  2702. }
  2703. //TUEY had to change this since we are adding other musical elements
  2704. setmusicstate("end_of_game");
  2705. setbusstate("default");
  2706.  
  2707. survived FadeOverTime( 1 );
  2708. survived.alpha = 1;
  2709.  
  2710. wait( 1 );
  2711.  
  2712. //play_sound_at_pos( "end_of_game", ( 0, 0, 0 ) );
  2713. wait( 2 );
  2714. intermission();
  2715.  
  2716. wait( level.zombie_vars["zombie_intermission_time"] );
  2717.  
  2718. level notify( "stop_intermission" );
  2719. array_thread( get_players(), ::player_exit_level );
  2720.  
  2721. bbPrint( "zombie_epilogs: rounds %d", level.round_number );
  2722.  
  2723. wait( 1.5 );
  2724.  
  2725. if( is_coop() )
  2726. {
  2727. ExitLevel( false );
  2728. }
  2729. else
  2730. {
  2731. MissionFailed();
  2732. }
  2733.  
  2734.  
  2735.  
  2736. // Let's not exit the function
  2737. wait( 666 );
  2738. }
  2739.  
  2740. update_leaderboards()
  2741. {
  2742. if( level.systemLink || IsSplitScreen() )
  2743. {
  2744. return;
  2745. }
  2746.  
  2747. nazizombies_upload_highscore();
  2748. nazizombies_set_new_zombie_stats();
  2749. }
  2750.  
  2751. player_fake_death()
  2752. {
  2753. level notify ("fake_death");
  2754. self notify ("fake_death");
  2755.  
  2756. self TakeAllWeapons();
  2757. self AllowStand( false );
  2758. self AllowCrouch( false );
  2759. self AllowProne( true );
  2760.  
  2761. self.ignoreme = true;
  2762. self EnableInvulnerability();
  2763.  
  2764. wait( 1 );
  2765. self FreezeControls( true );
  2766. }
  2767.  
  2768. player_exit_level()
  2769. {
  2770. self AllowStand( true );
  2771. self AllowCrouch( false );
  2772. self AllowProne( false );
  2773.  
  2774. if( IsDefined( self.game_over_bg ) )
  2775. {
  2776. self.game_over_bg.foreground = true;
  2777. self.game_over_bg.sort = 100;
  2778. self.game_over_bg FadeOverTime( 1 );
  2779. self.game_over_bg.alpha = 1;
  2780. }
  2781. }
  2782.  
  2783. player_killed_override()
  2784. {
  2785. // BLANK
  2786. level waittill( "forever" );
  2787. }
  2788.  
  2789.  
  2790. injured_walk()
  2791. {
  2792. self.ground_ref_ent = Spawn( "script_model", ( 0, 0, 0 ) );
  2793.  
  2794. self.player_speed = 50;
  2795.  
  2796. // TODO do death countdown
  2797. self AllowSprint( false );
  2798. self AllowProne( false );
  2799. self AllowCrouch( false );
  2800. self AllowAds( false );
  2801. self AllowJump( false );
  2802.  
  2803. self PlayerSetGroundReferenceEnt( self.ground_ref_ent );
  2804. self thread limp();
  2805. }
  2806.  
  2807. limp()
  2808. {
  2809. level endon( "disconnect" );
  2810. level endon( "death" );
  2811. // TODO uncomment when/if SetBlur works again
  2812. //self thread player_random_blur();
  2813.  
  2814. stumble = 0;
  2815. alt = 0;
  2816.  
  2817. while( 1 )
  2818. {
  2819. velocity = self GetVelocity();
  2820. player_speed = abs( velocity[0] ) + abs( velocity[1] );
  2821.  
  2822. if( player_speed < 10 )
  2823. {
  2824. wait( 0.05 );
  2825. continue;
  2826. }
  2827.  
  2828. speed_multiplier = player_speed / self.player_speed;
  2829.  
  2830. p = RandomFloatRange( 3, 5 );
  2831. if( RandomInt( 100 ) < 20 )
  2832. {
  2833. p *= 3;
  2834. }
  2835. r = RandomFloatRange( 3, 7 );
  2836. y = RandomFloatRange( -8, -2 );
  2837.  
  2838. stumble_angles = ( p, y, r );
  2839. stumble_angles = vector_multiply( stumble_angles, speed_multiplier );
  2840.  
  2841. stumble_time = RandomFloatRange( .35, .45 );
  2842. recover_time = RandomFloatRange( .65, .8 );
  2843.  
  2844. stumble++;
  2845. if( speed_multiplier > 1.3 )
  2846. {
  2847. stumble++;
  2848. }
  2849.  
  2850. self thread stumble( stumble_angles, stumble_time, recover_time );
  2851.  
  2852. level waittill( "recovered" );
  2853. }
  2854. }
  2855.  
  2856. stumble( stumble_angles, stumble_time, recover_time, no_notify )
  2857. {
  2858. stumble_angles = self adjust_angles_to_player( stumble_angles );
  2859.  
  2860. self.ground_ref_ent RotateTo( stumble_angles, stumble_time, ( stumble_time/4*3 ), ( stumble_time/4 ) );
  2861. self.ground_ref_ent waittill( "rotatedone" );
  2862.  
  2863. base_angles = ( RandomFloat( 4 ) - 4, RandomFloat( 5 ), 0 );
  2864. base_angles = self adjust_angles_to_player( base_angles );
  2865.  
  2866. self.ground_ref_ent RotateTo( base_angles, recover_time, 0, ( recover_time / 2 ) );
  2867. self.ground_ref_ent waittill( "rotatedone" );
  2868.  
  2869. if( !IsDefined( no_notify ) )
  2870. {
  2871. level notify( "recovered" );
  2872. }
  2873. }
  2874.  
  2875. adjust_angles_to_player( stumble_angles )
  2876. {
  2877. pa = stumble_angles[0];
  2878. ra = stumble_angles[2];
  2879.  
  2880. rv = AnglesToRight( self.angles );
  2881. fv = AnglesToForward( self.angles );
  2882.  
  2883. rva = ( rv[0], 0, rv[1]*-1 );
  2884. fva = ( fv[0], 0, fv[1]*-1 );
  2885. angles = vector_multiply( rva, pa );
  2886. angles = angles + vector_multiply( fva, ra );
  2887. return angles +( 0, stumble_angles[1], 0 );
  2888. }
  2889.  
  2890. coop_player_spawn_placement()
  2891. {
  2892. structs = getstructarray( "initial_spawn_points", "targetname" );
  2893.  
  2894. flag_wait( "all_players_connected" );
  2895.  
  2896. //chrisp - adding support for overriding the default spawning method
  2897.  
  2898. players = get_players();
  2899.  
  2900. for( i = 0; i < players.size; i++ )
  2901. {
  2902. players[i] setorigin( structs[i].origin );
  2903. players[i] setplayerangles( structs[i].angles );
  2904. players[i].spectator_respawn = structs[i];
  2905. }
  2906. }
  2907.  
  2908.  
  2909. player_zombie_breadcrumb()
  2910. {
  2911. self endon( "disconnect" );
  2912. self endon( "spawned_spectator" );
  2913. level endon( "intermission" );
  2914.  
  2915. self.zombie_breadcrumbs = [];
  2916. self.zombie_breadcrumb_distance = 24 * 24; // min dist (squared) the player must move to drop a crumb
  2917. self.zombie_breadcrumb_area_num = 3; // the number of "rings" the area breadcrumbs use
  2918. self.zombie_breadcrumb_area_distance = 16; // the distance between each "ring" of the area breadcrumbs
  2919.  
  2920. self store_crumb( self.origin );
  2921. last_crumb = self.origin;
  2922.  
  2923. self thread debug_breadcrumbs();
  2924.  
  2925. while( 1 )
  2926. {
  2927. wait_time = 0.1;
  2928.  
  2929. /#
  2930. if( self isnotarget() )
  2931. {
  2932. wait( wait_time );
  2933. continue;
  2934. }
  2935. #/
  2936.  
  2937. store_crumb = true;
  2938. airborne = false;
  2939. crumb = self.origin;
  2940.  
  2941. if ( !self IsOnGround() )
  2942. {
  2943. airborne = true;
  2944. store_crumb = false;
  2945. wait_time = 0.05;
  2946. }
  2947.  
  2948. if( !airborne && DistanceSquared( crumb, last_crumb ) < self.zombie_breadcrumb_distance )
  2949. {
  2950. store_crumb = false;
  2951. }
  2952.  
  2953. if ( airborne && self IsOnGround() )
  2954. {
  2955. // player was airborne, store crumb now that he's on the ground
  2956. store_crumb = true;
  2957. airborne = false;
  2958. }
  2959.  
  2960. // PI_CHANGE_BEGIN
  2961. // JMA - we don't need to store new crumbs, the zipline will store our destination as a crumb
  2962. if( (isDefined(level.script) && level.script == "nazi_zombie_sumpf" && (isDefined(self.on_zipline) && self.on_zipline == true)) )
  2963. {
  2964. airborne = false;
  2965. store_crumb = false;
  2966. }
  2967. // PI_CHANGE_END
  2968.  
  2969. if( store_crumb )
  2970. {
  2971. debug_print( "Player is storing breadcrumb " + crumb );
  2972. last_crumb = crumb;
  2973. self store_crumb( crumb );
  2974. }
  2975.  
  2976. wait( wait_time );
  2977. }
  2978. }
  2979.  
  2980.  
  2981. store_crumb( origin )
  2982. {
  2983. offsets = [];
  2984. height_offset = 32;
  2985.  
  2986. index = 0;
  2987. for( j = 1; j <= self.zombie_breadcrumb_area_num; j++ )
  2988. {
  2989. offset = ( j * self.zombie_breadcrumb_area_distance );
  2990.  
  2991. offsets[0] = ( origin[0] - offset, origin[1], origin[2] );
  2992. offsets[1] = ( origin[0] + offset, origin[1], origin[2] );
  2993. offsets[2] = ( origin[0], origin[1] - offset, origin[2] );
  2994. offsets[3] = ( origin[0], origin[1] + offset, origin[2] );
  2995.  
  2996. offsets[4] = ( origin[0] - offset, origin[1], origin[2] + height_offset );
  2997. offsets[5] = ( origin[0] + offset, origin[1], origin[2] + height_offset );
  2998. offsets[6] = ( origin[0], origin[1] - offset, origin[2] + height_offset );
  2999. offsets[7] = ( origin[0], origin[1] + offset, origin[2] + height_offset );
  3000.  
  3001. for ( i = 0; i < offsets.size; i++ )
  3002. {
  3003. self.zombie_breadcrumbs[index] = offsets[i];
  3004. index++;
  3005. }
  3006. }
  3007. }
  3008.  
  3009.  
  3010. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3011. /////////////////////////////////////////////////LEADERBOARD CODE///////////////////////////////////////////////////////////
  3012. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3013.  
  3014. //CODER MOD: TOMMY K
  3015. nazizombies_upload_highscore()
  3016. {
  3017. // Nazi Zombie Leaderboards
  3018. // nazi_zombie_prototype_waves = 13
  3019. // nazi_zombie_prototype_points = 14
  3020.  
  3021. // this has gotta be the dumbest way of doing this, but at 1:33am in the morning my brain is fried!
  3022. playersRank = 1;
  3023. if( level.players_playing == 1 )
  3024. playersRank = 4;
  3025. else if( level.players_playing == 2 )
  3026. playersRank = 3;
  3027. else if( level.players_playing == 3 )
  3028. playersRank = 2;
  3029.  
  3030. map_name = GetDvar( "mapname" );
  3031.  
  3032. if ( !isZombieLeaderboardAvailable( map_name, "waves" ) || !isZombieLeaderboardAvailable( map_name, "points" ) )
  3033. return;
  3034.  
  3035. players = get_players();
  3036. for( i = 0; i < players.size; i++ )
  3037. {
  3038. pre_highest_wave = players[i] playerZombieStatGet( map_name, "highestwave" );
  3039. pre_time_in_wave = players[i] playerZombieStatGet( map_name, "timeinwave" );
  3040.  
  3041. new_highest_wave = level.round_number + "" + playersRank;
  3042. new_highest_wave = int( new_highest_wave );
  3043.  
  3044. if( new_highest_wave >= pre_highest_wave )
  3045. {
  3046. if( players[i].zombification_time == 0 )
  3047. {
  3048. players[i].zombification_time = getTime();
  3049. }
  3050.  
  3051. player_survival_time = players[i].zombification_time - level.round_start_time;
  3052. player_survival_time = int( player_survival_time/1000 );
  3053.  
  3054. if( new_highest_wave > pre_highest_wave || player_survival_time > pre_time_in_wave )
  3055. {
  3056. rankNumber = makeRankNumber( level.round_number, playersRank, player_survival_time );
  3057.  
  3058. leaderboard_number = getZombieLeaderboardNumber( map_name, "waves" );
  3059.  
  3060. players[i] UploadScore( leaderboard_number, int(rankNumber), level.round_number, player_survival_time, level.players_playing );
  3061. //players[i] UploadScore( leaderboard_number, int(rankNumber), level.round_number );
  3062.  
  3063. players[i] playerZombieStatSet( map_name, "highestwave", new_highest_wave );
  3064. players[i] playerZombieStatSet( map_name, "timeinwave", player_survival_time );
  3065. }
  3066. }
  3067.  
  3068. pre_total_points = players[i] playerZombieStatGet( map_name, "totalpoints" );
  3069. if( players[i].score_total > pre_total_points )
  3070. {
  3071. leaderboard_number = getZombieLeaderboardNumber( map_name, "points" );
  3072.  
  3073. players[i] UploadScore( leaderboard_number, players[i].score_total, players[i].kills, level.players_playing );
  3074.  
  3075. players[i] playerZombieStatSet( map_name, "totalpoints", players[i].score_total );
  3076. }
  3077. }
  3078. }
  3079.  
  3080. isZombieLeaderboardAvailable( map, type )
  3081. {
  3082. if ( !isDefined( level.zombieLeaderboardNumber[map] ) )
  3083. return 0;
  3084.  
  3085. if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) )
  3086. return 0;
  3087.  
  3088. return 1;
  3089. }
  3090.  
  3091. getZombieLeaderboardNumber( map, type )
  3092. {
  3093. if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) )
  3094. assertMsg( "Unknown leaderboard number for map " + map + "and type " + type );
  3095.  
  3096. return level.zombieLeaderboardNumber[map][type];
  3097. }
  3098.  
  3099. getZombieStatVariable( map, variable )
  3100. {
  3101. if ( !isDefined( level.zombieLeaderboardStatVariable[map][variable] ) )
  3102. assertMsg( "Unknown stat variable " + variable + " for map " + map );
  3103.  
  3104. return level.zombieLeaderboardStatVariable[map][variable];
  3105. }
  3106.  
  3107. playerZombieStatGet( map, variable )
  3108. {
  3109. stat_variable = getZombieStatVariable( map, variable );
  3110. result = self zombieStatGet( stat_variable );
  3111.  
  3112. return result;
  3113. }
  3114.  
  3115. playerZombieStatSet( map, variable, value )
  3116. {
  3117. stat_variable = getZombieStatVariable( map, variable );
  3118. self zombieStatSet( stat_variable, value );
  3119. }
  3120.  
  3121. nazizombies_set_new_zombie_stats()
  3122. {
  3123. players = get_players();
  3124. for( i = 0; i < players.size; i++ )
  3125. {
  3126. //grab stat and add final totals
  3127. total_kills = players[i] zombieStatGet( "zombie_kills" ) + players[i].stats["kills"];
  3128. total_points = players[i] zombieStatGet( "zombie_points" ) + players[i].stats["score"];
  3129. total_rounds = players[i] zombieStatGet( "zombie_rounds" ) + (level.round_number - 1); // rounds survived
  3130. total_downs = players[i] zombieStatGet( "zombie_downs" ) + players[i].stats["downs"];
  3131. total_revives = players[i] zombieStatGet( "zombie_revives" ) + players[i].stats["revives"];
  3132. total_perks = players[i] zombieStatGet( "zombie_perks_consumed" ) + players[i].stats["perks"];
  3133. total_headshots = players[i] zombieStatGet( "zombie_heashots" ) + players[i].stats["headshots"];
  3134. total_zombie_gibs = players[i] zombieStatGet( "zombie_gibs" ) + players[i].stats["zombie_gibs"];
  3135.  
  3136. //set zombie stats
  3137. players[i] zombieStatSet( "zombie_kills", total_kills );
  3138. players[i] zombieStatSet( "zombie_points", total_points );
  3139. players[i] zombieStatSet( "zombie_rounds", total_rounds );
  3140. players[i] zombieStatSet( "zombie_downs", total_downs );
  3141. players[i] zombieStatSet( "zombie_revives", total_revives );
  3142. players[i] zombieStatSet( "zombie_perks_consumed", total_perks );
  3143. players[i] zombieStatSet( "zombie_heashots", total_headshots );
  3144. players[i] zombieStatSet( "zombie_gibs", total_zombie_gibs );
  3145. }
  3146. }
  3147.  
  3148. makeRankNumber( wave, players, time )
  3149. {
  3150. if( time > 86400 )
  3151. time = 86400; // cap it at like 1 day, need to cap cause you know some muppet is gonna end up trying it
  3152.  
  3153. //pad out time
  3154. padding = "";
  3155. if ( 10 > time )
  3156. padding += "0000";
  3157. else if( 100 > time )
  3158. padding += "000";
  3159. else if( 1000 > time )
  3160. padding += "00";
  3161. else if( 10000 > time )
  3162. padding += "0";
  3163.  
  3164. rank = wave + "" + players + padding + time;
  3165.  
  3166. return rank;
  3167. }
  3168.  
  3169.  
  3170. //CODER MOD: TOMMY K
  3171. /*
  3172. =============
  3173. statGet
  3174.  
  3175. Returns the value of the named stat
  3176. =============
  3177. */
  3178. zombieStatGet( dataName )
  3179. {
  3180. if( level.systemLink || true == IsSplitScreen() )
  3181. {
  3182. return;
  3183. }
  3184.  
  3185. return self getStat( int(tableLookup( "mp/playerStatsTable.csv", 1, dataName, 0 )) );
  3186. }
  3187.  
  3188. //CODER MOD: TOMMY K
  3189. /*
  3190. =============
  3191. setStat
  3192.  
  3193. Sets the value of the named stat
  3194. =============
  3195. */
  3196. zombieStatSet( dataName, value )
  3197. {
  3198. if( level.systemLink || true == IsSplitScreen() )
  3199. {
  3200. return;
  3201. }
  3202.  
  3203. self setStat( int(tableLookup( "mp/playerStatsTable.csv", 1, dataName, 0 )), value );
  3204. }
  3205.  
  3206.  
  3207. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3208. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3209. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3210.  
  3211. //
  3212. // INTERMISSION =========================================================== //
  3213. //
  3214.  
  3215. intermission()
  3216. {
  3217. level.intermission = true;
  3218. level notify( "intermission" );
  3219.  
  3220. players = get_players();
  3221. for( i = 0; i < players.size; i++ )
  3222. {
  3223. setclientsysstate( "levelNotify", "zi", players[i] ); // Tell clientscripts we're in zombie intermission
  3224.  
  3225. players[i] SetClientDvars( "cg_thirdPerson", "0",
  3226. "cg_fov", "65" );
  3227.  
  3228. players[i].health = 100; // This is needed so the player view doesn't get stuck
  3229. players[i] thread [[level.custom_intermission]]();
  3230. }
  3231.  
  3232. wait( 0.25 );
  3233.  
  3234. // Delay the last stand monitor so we are 100% sure the zombie intermission ("zi") is set on the cients
  3235. players = get_players();
  3236. for( i = 0; i < players.size; i++ )
  3237. {
  3238. setClientSysState( "lsm", "1", players[i] );
  3239. }
  3240.  
  3241. visionset = "zombie";
  3242. if( IsDefined( level.zombie_vars["intermission_visionset"] ) )
  3243. {
  3244. visionset = level.zombie_vars["intermission_visionset"];
  3245. }
  3246.  
  3247. level thread maps\_utility::set_all_players_visionset( visionset, 2 );
  3248. level thread zombie_game_over_death();
  3249. }
  3250.  
  3251. zombie_game_over_death()
  3252. {
  3253. // Kill remaining zombies, in style!
  3254. zombies = GetAiArray( "axis" );
  3255. for( i = 0; i < zombies.size; i++ )
  3256. {
  3257. if( !IsAlive( zombies[i] ) )
  3258. {
  3259. continue;
  3260. }
  3261.  
  3262. zombies[i] SetGoalPos( zombies[i].origin );
  3263. }
  3264.  
  3265. for( i = 0; i < zombies.size; i++ )
  3266. {
  3267. if( !IsAlive( zombies[i] ) )
  3268. {
  3269. continue;
  3270. }
  3271.  
  3272. wait( 0.5 + RandomFloat( 2 ) );
  3273.  
  3274. zombies[i] maps\_zombiemode_spawner::zombie_head_gib();
  3275. zombies[i] DoDamage( zombies[i].health + 666, zombies[i].origin );
  3276. }
  3277. }
  3278.  
  3279. player_intermission()
  3280. {
  3281. self closeMenu();
  3282. self closeInGameMenu();
  3283.  
  3284. level endon( "stop_intermission" );
  3285. self endon("disconnect");
  3286. self endon("death");
  3287.  
  3288. //Show total gained point for end scoreboard and lobby
  3289. self.score = self.score_total;
  3290.  
  3291. self.sessionstate = "intermission";
  3292. self.spectatorclient = -1;
  3293. self.killcamentity = -1;
  3294. self.archivetime = 0;
  3295. self.psoffsettime = 0;
  3296. self.friendlydamage = undefined;
  3297.  
  3298. points = getstructarray( "intermission", "targetname" );
  3299.  
  3300. if( !IsDefined( points ) || points.size == 0 )
  3301. {
  3302. points = getentarray( "info_intermission", "classname" );
  3303. if( points.size < 1 )
  3304. {
  3305. println( "NO info_intermission POINTS IN MAP" );
  3306. return;
  3307. }
  3308. }
  3309.  
  3310. self.game_over_bg = NewClientHudelem( self );
  3311. self.game_over_bg.horzAlign = "fullscreen";
  3312. self.game_over_bg.vertAlign = "fullscreen";
  3313. self.game_over_bg SetShader( "black", 640, 480 );
  3314. self.game_over_bg.alpha = 1;
  3315.  
  3316. org = undefined;
  3317. while( 1 )
  3318. {
  3319. points = array_randomize( points );
  3320. for( i = 0; i < points.size; i++ )
  3321. {
  3322. point = points[i];
  3323. // Only spawn once if we are using 'moving' org
  3324. // If only using info_intermissions, this will respawn after 5 seconds.
  3325. if( !IsDefined( org ) )
  3326. {
  3327. self Spawn( point.origin, point.angles );
  3328. }
  3329.  
  3330. // Only used with STRUCTS
  3331. if( IsDefined( points[i].target ) )
  3332. {
  3333. if( !IsDefined( org ) )
  3334. {
  3335. org = Spawn( "script_origin", self.origin + ( 0, 0, -60 ) );
  3336. }
  3337.  
  3338. self LinkTo( org, "", ( 0, 0, -60 ), ( 0, 0, 0 ) );
  3339. self SetPlayerAngles( points[i].angles );
  3340. org.origin = points[i].origin;
  3341.  
  3342. speed = 20;
  3343. if( IsDefined( points[i].speed ) )
  3344. {
  3345. speed = points[i].speed;
  3346. }
  3347.  
  3348. target_point = getstruct( points[i].target, "targetname" );
  3349. dist = Distance( points[i].origin, target_point.origin );
  3350. time = dist / speed;
  3351.  
  3352. q_time = time * 0.25;
  3353. if( q_time > 1 )
  3354. {
  3355. q_time = 1;
  3356. }
  3357.  
  3358. self.game_over_bg FadeOverTime( q_time );
  3359. self.game_over_bg.alpha = 0;
  3360.  
  3361. org MoveTo( target_point.origin, time, q_time, q_time );
  3362. org RotateTo( target_point.angles, time, q_time, q_time );
  3363. wait( time - q_time );
  3364.  
  3365. self.game_over_bg FadeOverTime( q_time );
  3366. self.game_over_bg.alpha = 1;
  3367.  
  3368. wait( q_time );
  3369. }
  3370. else
  3371. {
  3372. self.game_over_bg FadeOverTime( 1 );
  3373. self.game_over_bg.alpha = 0;
  3374.  
  3375. wait( 5 );
  3376.  
  3377. self.game_over_bg FadeOverTime( 1 );
  3378. self.game_over_bg.alpha = 1;
  3379.  
  3380. wait( 1 );
  3381. }
  3382. }
  3383. }
  3384. }
  3385.  
  3386. prevent_near_origin()
  3387. {
  3388. while (1)
  3389. {
  3390. players = get_players();
  3391.  
  3392. for (i = 0; i < players.size; i++)
  3393. {
  3394. for (q = 0; q < players.size; q++)
  3395. {
  3396. if (players[i] != players[q])
  3397. {
  3398. if (check_to_kill_near_origin(players[i], players[q]))
  3399. {
  3400. p1_org = players[i].origin;
  3401. p2_org = players[q].origin;
  3402.  
  3403. wait 5;
  3404.  
  3405. if (check_to_kill_near_origin(players[i], players[q]))
  3406. {
  3407. if ( (distance(players[i].origin, p1_org) < 30) && distance(players[q].origin, p2_org) < 30)
  3408. {
  3409. setsaveddvar("player_deathInvulnerableTime", 0);
  3410. players[i] DoDamage( players[i].health + 1000, players[i].origin, undefined, undefined, "riflebullet" );
  3411. setsaveddvar("player_deathInvulnerableTime", level.startInvulnerableTime);
  3412. }
  3413. }
  3414. }
  3415. }
  3416. }
  3417. }
  3418.  
  3419. wait 0.2;
  3420. }
  3421. }
  3422.  
  3423. check_to_kill_near_origin(player1, player2)
  3424. {
  3425. if (!isdefined(player1) || !isdefined(player2))
  3426. {
  3427. return false;
  3428. }
  3429.  
  3430. if (distance(player1.origin, player2.origin) > 12)
  3431. {
  3432. return false;
  3433. }
  3434.  
  3435. if ( player1 maps\_laststand::player_is_in_laststand() || player2 maps\_laststand::player_is_in_laststand() )
  3436. {
  3437. return false;
  3438. }
  3439.  
  3440. if (!isalive(player1) || !isalive(player2))
  3441. {
  3442. return false;
  3443. }
  3444.  
  3445. return true;
  3446. }
  3447.  
  3448.  
  3449. //
  3450. crawler_round_tracker()
  3451. {
  3452. level.crawler_round_count = 1;
  3453.  
  3454. level.next_crawler_round = 4;
  3455.  
  3456. sav_func = level.round_spawn_func;
  3457. while ( 1 )
  3458. {
  3459. level waittill ( "between_round_over" );
  3460.  
  3461. /#
  3462. if( GetDVarInt( "force_crawlers" ) > 0 )
  3463. {
  3464. next_crawler_round = level.round_number;
  3465. }
  3466. #/
  3467.  
  3468. if ( level.round_number == level.next_crawler_round )
  3469. {
  3470. sav_func = level.round_spawn_func;
  3471. crawler_round_start();
  3472. level.round_spawn_func = ::round_spawning;
  3473.  
  3474. if ( IsDefined( level.next_dog_round ) )
  3475. {
  3476. level.next_crawler_round = level.next_dog_round + randomintrange( 2, 3 );
  3477. }
  3478. else
  3479. {
  3480. level.next_crawler_round = randomintrange( 4, 6 );
  3481. }
  3482. /#
  3483. get_players()[0] iprintln( "Next crawler round: " + level.next_crawler_round );
  3484. #/
  3485. }
  3486. else if ( flag( "crawler_round" ) )
  3487. {
  3488. crawler_round_stop();
  3489.  
  3490. // Don't trample over the round_spawn_func setting
  3491. if ( IsDefined( level.next_dog_round ) &&
  3492. level.next_dog_round == level.round_number )
  3493. {
  3494. level.round_spawn_func = sav_func;
  3495. }
  3496.  
  3497. level.crawler_round_count += 1;
  3498. }
  3499. }
  3500. }
  3501.  
  3502.  
  3503. crawler_round_start()
  3504. {
  3505. flag_set( "crawler_round" );
  3506. // play_sound_2D( "dark_sting" );
  3507. if(!IsDefined (level.crawlerround_nomusic))
  3508. {
  3509. level.crawlerround_nomusic = 0;
  3510. }
  3511. level.crawlerround_nomusic = 1;
  3512. level notify( "crawler_round_starting" );
  3513. clientnotify( "crawler_start" );
  3514. }
  3515.  
  3516.  
  3517. crawler_round_stop()
  3518. {
  3519. flag_clear( "crawler_round" );
  3520.  
  3521. if(!IsDefined (level.crawlerround_nomusic))
  3522. {
  3523. level.crawlerround_nomusic = 0;
  3524. }
  3525. level.crawlerround_nomusic = 0;
  3526. level notify( "crawler_round_ending" );
  3527. clientnotify( "crawler_stop" );
  3528. }
Advertisement
Add Comment
Please, Sign In to add comment