Guest User

_zombiemode

a guest
Mar 12th, 2014
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 90.86 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_bowie::bowie_init();
  68. maps\_zombiemode_cymbal_monkey::init();
  69. maps\_zombiemode_betty::init();
  70. maps\_zombiemode_timer::init();
  71. maps\_zombiemode_auto_turret::init();
  72.  
  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 ); //project
  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 = false;
  1565. }
  1566. }
  1567. else if ( level.round_number > 25 && mixed_spawns < 3 )
  1568. {
  1569. if ( RandomInt(100) < 2 )
  1570. {
  1571. spawn_dog = false;
  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 = false;
  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.  
  1710. /*
  1711. while(level.begin_playing == false)
  1712. {
  1713. level.begin_playing = true;
  1714. level.no_mans_land = "disabled";
  1715. wait .1;
  1716. }
  1717.  
  1718. wait 2;
  1719.  
  1720. */
  1721.  
  1722. level.zombie_health = level.zombie_vars["zombie_health_start"];
  1723. level.round_number = 1;
  1724. level.first_round = true;
  1725.  
  1726. // so players get init'ed with grenades
  1727. players = get_players();
  1728. for (i = 0; i < players.size; i++)
  1729. {
  1730. players[i] giveweapon( "stielhandgranate" );
  1731. players[i] setweaponammoclip( "stielhandgranate", 0);
  1732. }
  1733.  
  1734. level.chalk_hud1 = create_chalk_hud();
  1735. level.chalk_hud2 = create_chalk_hud( 64 );
  1736.  
  1737. // level waittill( "introscreen_done" );
  1738.  
  1739. level.round_spawn_func = ::round_spawning;
  1740.  
  1741. /#
  1742. if (GetDVarInt("zombie_rise_test"))
  1743. {
  1744. level.round_spawn_func = ::round_spawning_test; // FOR TESTING, one zombie at a time, no round advancement
  1745. }
  1746. #/
  1747.  
  1748. level thread round_think();
  1749. }
  1750.  
  1751.  
  1752. create_chalk_hud( x )
  1753. {
  1754. if( !IsDefined( x ) )
  1755. {
  1756. x = 0;
  1757. }
  1758.  
  1759. hud = create_simple_hud();
  1760. hud.alignX = "left";
  1761. hud.alignY = "bottom";
  1762. hud.horzAlign = "left";
  1763. hud.vertAlign = "bottom";
  1764. hud.color = ( 0.423, 0.004, 0 );
  1765. hud.x = x;
  1766. hud.alpha = 0;
  1767.  
  1768. hud SetShader( "hud_chalk_1", 64, 64 );
  1769.  
  1770. return hud;
  1771. }
  1772. play_intro_VO()
  1773. {
  1774.  
  1775. wait(3);
  1776. players = getplayers();
  1777. for(i=0;i<players.size;i++)
  1778. {
  1779. index = maps\_zombiemode_weapons::get_player_index(players[i]);
  1780. player_index = "plr_" + index + "_";
  1781. sound_to_play = "vox_name_int_0";
  1782. players[i] maps\_zombiemode_spawner::do_player_playdialog(player_index, sound_to_play, 0.05);
  1783. wait(0.7);
  1784. }
  1785.  
  1786. //Plays a random start line on one of the characters
  1787. // i = randomintrange(0,players.size);
  1788. // players[i] playsound ("plr_" + i + "_vox_start" + "_" + randomintrange(0, variation_count));
  1789.  
  1790. }
  1791.  
  1792. //
  1793. // Let's the players know that you need power to open these
  1794. play_door_dialog()
  1795. {
  1796. level endon( "electricity_on" );
  1797. self endon ("warning_dialog");
  1798. timer = 0;
  1799.  
  1800. while(1)
  1801. {
  1802. wait(0.05);
  1803. players = get_players();
  1804. for(i = 0; i < players.size; i++)
  1805. {
  1806. dist = distancesquared(players[i].origin, self.origin );
  1807. if(dist > 70*70)
  1808. {
  1809. timer =0;
  1810. continue;
  1811. }
  1812. while(dist < 70*70 && timer < 3)
  1813. {
  1814. wait(0.5);
  1815. timer++;
  1816. }
  1817. if(dist > 70*70 && timer >= 3)
  1818. {
  1819. self playsound("door_deny");
  1820. players[i] thread do_player_vo("vox_start", 5);
  1821. wait(3);
  1822. self notify ("warning_dialog");
  1823. //iprintlnbold("warning_given");
  1824. }
  1825. }
  1826. }
  1827. }
  1828.  
  1829. wait_until_first_player()
  1830. {
  1831. players = get_players();
  1832. if( !IsDefined( players[0] ) )
  1833. {
  1834. level waittill( "first_player_ready" );
  1835. }
  1836. }
  1837. chalk_one_up()
  1838. {
  1839.  
  1840. if(!IsDefined(level.doground_nomusic))
  1841. {
  1842. level.doground_nomusic = 0;
  1843. }
  1844. if( level.first_round )
  1845. {
  1846. intro = true;
  1847. //Play the intro sound at the beginning of the round
  1848. //level thread play_intro_VO(); (commented out for Corky)
  1849.  
  1850. }
  1851. else
  1852. {
  1853. intro = false;
  1854. }
  1855.  
  1856. round = undefined;
  1857. if( intro )
  1858. {
  1859. round = create_simple_hud();
  1860. round.alignX = "center";
  1861. round.alignY = "bottom";
  1862. round.horzAlign = "center";
  1863. round.vertAlign = "bottom";
  1864. round.fontscale = 16;
  1865. round.color = ( 1, 1, 1 );
  1866. round.x = 0;
  1867. round.y = -265;
  1868. round.alpha = 0;
  1869. round SetText( &"ZOMBIE_ROUND" );
  1870.  
  1871. round FadeOverTime( 1 );
  1872. round.alpha = 1;
  1873. wait( 1 );
  1874.  
  1875. round FadeOverTime( 3 );
  1876. // round.color = ( 0.8, 0, 0 );
  1877. round.color = ( 0.423, 0.004, 0 );
  1878. }
  1879.  
  1880. hud = undefined;
  1881. if( level.round_number < 6 || level.round_number > 10 )
  1882. {
  1883. hud = level.chalk_hud1;
  1884. hud.fontscale = 32;
  1885. }
  1886. else if( level.round_number < 11 )
  1887. {
  1888. hud = level.chalk_hud2;
  1889. }
  1890.  
  1891. if( intro )
  1892. {
  1893. hud.alpha = 0;
  1894. hud.horzAlign = "center";
  1895. hud.x = -5;
  1896. hud.y = -200;
  1897. }
  1898.  
  1899. hud FadeOverTime( 0.5 );
  1900. hud.alpha = 0;
  1901.  
  1902. if( level.round_number == 11 && IsDefined( level.chalk_hud2 ) )
  1903. {
  1904. level.chalk_hud2 FadeOverTime( 0.5 );
  1905. level.chalk_hud2.alpha = 0;
  1906. }
  1907.  
  1908. wait( 0.5 );
  1909.  
  1910. // play_sound_at_pos( "chalk_one_up", ( 0, 0, 0 ) );
  1911.  
  1912. if(IsDefined(level.eggs) && level.eggs !=1 )
  1913. {
  1914. if(level.doground_nomusic ==0 )
  1915. {
  1916. setmusicstate("round_begin");
  1917. }
  1918.  
  1919. }
  1920.  
  1921. if( level.round_number == 11 && IsDefined( level.chalk_hud2 ) )
  1922. {
  1923. level.chalk_hud2 destroy_hud();
  1924. }
  1925.  
  1926. if( level.round_number > 10 )
  1927. {
  1928. hud SetValue( level.round_number );
  1929. }
  1930.  
  1931. hud FadeOverTime( 0.5 );
  1932. hud.alpha = 1;
  1933.  
  1934. if( intro )
  1935. {
  1936. wait( 3 );
  1937.  
  1938. if( IsDefined( round ) )
  1939. {
  1940. round FadeOverTime( 1 );
  1941. round.alpha = 0;
  1942. }
  1943.  
  1944. wait( 0.25 );
  1945.  
  1946. level notify( "intro_hud_done" );
  1947. hud MoveOverTime( 1.75 );
  1948. hud.horzAlign = "left";
  1949. // hud.x = 0;
  1950. hud.y = 0;
  1951. wait( 2 );
  1952.  
  1953. round destroy_hud();
  1954. }
  1955.  
  1956. if( level.round_number > 10 )
  1957. {
  1958. }
  1959. else if( level.round_number > 5 )
  1960. {
  1961. hud SetShader( "hud_chalk_" + ( level.round_number - 5 ), 64, 64 );
  1962. }
  1963. else if( level.round_number > 1 )
  1964. {
  1965. hud SetShader( "hud_chalk_" + level.round_number, 64, 64 );
  1966. }
  1967. /*
  1968. else
  1969. {
  1970. setmusicstate("WAVE_1");
  1971. }
  1972. */
  1973.  
  1974. // ReportMTU(level.round_number); // In network debug instrumented builds, causes network spike report to generate.
  1975. }
  1976.  
  1977.  
  1978. chalk_round_hint()
  1979. {
  1980. huds = [];
  1981. huds[huds.size] = level.chalk_hud1;
  1982.  
  1983. if( level.round_number > 5 && level.round_number < 11 )
  1984. {
  1985. huds[huds.size] = level.chalk_hud2;
  1986. }
  1987.  
  1988. time = level.zombie_vars["zombie_between_round_time"];
  1989. for( i = 0; i < huds.size; i++ )
  1990. {
  1991. huds[i] FadeOverTime( time * 0.25 );
  1992. huds[i].color = ( 1, 1, 1 );
  1993. }
  1994. if(IsDefined(level.eggs) && level.eggs !=1)
  1995. {
  1996. if(IsDefined(level.doground_nomusic && level.doground_nomusic == 0 ))
  1997. {
  1998. setmusicstate("round_end");
  1999. wait( time * 0.25 );
  2000. }
  2001. else if(IsDefined(level.doground_nomusic && level.doground_nomusic == 1 ))
  2002. {
  2003. play_sound_2D( "bright_sting" );
  2004.  
  2005. }
  2006. }
  2007. // play_sound_at_pos( "end_of_round", ( 0, 0, 0 ) );
  2008.  
  2009.  
  2010.  
  2011. // Pulse
  2012. fade_time = 0.5;
  2013. steps = ( time * 0.5 ) / fade_time;
  2014. for( q = 0; q < steps; q++ )
  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 = 0;
  2025. }
  2026.  
  2027. wait( fade_time );
  2028.  
  2029. for( i = 0; i < huds.size; i++ )
  2030. {
  2031. if( !IsDefined( huds[i] ) )
  2032. {
  2033. continue;
  2034. }
  2035.  
  2036. huds[i] FadeOverTime( fade_time );
  2037. huds[i].alpha = 1;
  2038. }
  2039.  
  2040. wait( fade_time );
  2041. }
  2042.  
  2043. for( i = 0; i < huds.size; i++ )
  2044. {
  2045. if( !IsDefined( huds[i] ) )
  2046. {
  2047. continue;
  2048. }
  2049.  
  2050. huds[i] FadeOverTime( time * 0.25 );
  2051. // huds[i].color = ( 0.8, 0, 0 );
  2052. huds[i].color = ( 0.423, 0.004, 0 );
  2053. huds[i].alpha = 1;
  2054. }
  2055. }
  2056.  
  2057. round_think()
  2058. {
  2059. for( ;; )
  2060. {
  2061. //////////////////////////////////////////
  2062. //designed by prod DT#36173
  2063. maxreward = 50 * level.round_number;
  2064. if ( maxreward > 500 )
  2065. maxreward = 500;
  2066. level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward;
  2067. //////////////////////////////////////////
  2068.  
  2069. /*
  2070. while(level.no_mans_land == "active")
  2071. {
  2072. wait .1;
  2073. }
  2074. */
  2075.  
  2076. level.round_timer = level.zombie_vars["zombie_round_time"];
  2077.  
  2078. add_later_round_spawners();
  2079.  
  2080. chalk_one_up();
  2081. // round_text( &"ZOMBIE_ROUND_BEGIN" );
  2082.  
  2083. maps\_zombiemode_powerups::powerup_round_start();
  2084.  
  2085. players = get_players();
  2086. array_thread( players, maps\_zombiemode_blockers_new::rebuild_barrier_reward_reset );
  2087.  
  2088. level thread award_grenades_for_survivors();
  2089.  
  2090. bbPrint( "zombie_rounds: round %d player_count %d", level.round_number, players.size );
  2091.  
  2092. level.round_start_time = getTime();
  2093. level thread [[level.round_spawn_func]]();
  2094.  
  2095. round_wait();
  2096. level.first_round = false;
  2097.  
  2098. level thread spectators_respawn();
  2099.  
  2100. // round_text( &"ZOMBIE_ROUND_END" );
  2101. level thread chalk_round_hint();
  2102.  
  2103. wait( level.zombie_vars["zombie_between_round_time"] );
  2104.  
  2105. // here's the difficulty increase over time area
  2106. timer = level.zombie_vars["zombie_spawn_delay"];
  2107.  
  2108. if( timer < 0.08 )
  2109. {
  2110. timer = 0.08;
  2111. }
  2112.  
  2113. level.zombie_vars["zombie_spawn_delay"] = timer * 0.95;
  2114.  
  2115. // Increase the zombie move speed
  2116. level.zombie_move_speed = level.round_number * 8;
  2117.  
  2118. level.round_number++;
  2119.  
  2120. level notify( "between_round_over" );
  2121. }
  2122. }
  2123.  
  2124.  
  2125. award_grenades_for_survivors()
  2126. {
  2127. players = get_players();
  2128.  
  2129. for (i = 0; i < players.size; i++)
  2130. {
  2131. if (!players[i].is_zombie)
  2132. {
  2133. if( !players[i] HasWeapon( "stielhandgranate" ) )
  2134. {
  2135. players[i] GiveWeapon( "stielhandgranate" );
  2136. players[i] SetWeaponAmmoClip( "stielhandgranate", 0 );
  2137. }
  2138.  
  2139. if ( players[i] GetFractionMaxAmmo( "stielhandgranate") < .25 )
  2140. {
  2141. players[i] SetWeaponAmmoClip( "stielhandgranate", 2 );
  2142. }
  2143. else if (players[i] GetFractionMaxAmmo( "stielhandgranate") < .5 )
  2144. {
  2145. players[i] SetWeaponAmmoClip( "stielhandgranate", 3 );
  2146. }
  2147. else
  2148. {
  2149. players[i] SetWeaponAmmoClip( "stielhandgranate", 4 );
  2150. }
  2151. }
  2152. }
  2153. }
  2154.  
  2155. ai_calculate_health()
  2156. {
  2157. // After round 10, get exponentially harder
  2158. if( level.round_number >= 10 )
  2159. {
  2160. level.zombie_health += Int( level.zombie_health * level.zombie_vars["zombie_health_increase_percent"] );
  2161. return;
  2162. }
  2163.  
  2164. if( level.round_number > 1 )
  2165. {
  2166. level.zombie_health = Int( level.zombie_health + level.zombie_vars["zombie_health_increase"] );
  2167. }
  2168.  
  2169. }
  2170.  
  2171. //put the conditions in here which should
  2172. //cause the failsafe to reset
  2173. round_spawn_failsafe()
  2174. {
  2175. self endon("death");//guy just died
  2176.  
  2177. //////////////////////////////////////////////////////////////
  2178. //FAILSAFE "hack shit" DT#33203
  2179. //////////////////////////////////////////////////////////////
  2180. prevorigin = self.origin;
  2181. while(1)
  2182. {
  2183. if( !level.zombie_vars["zombie_use_failsafe"] )
  2184. {
  2185. return;
  2186. }
  2187.  
  2188. wait( 30 );
  2189.  
  2190. //if i've torn a board down in the last 5 seconds, just
  2191. //wait 30 again.
  2192. if ( isDefined(self.lastchunk_destroy_time) )
  2193. {
  2194. if ( (getTime() - self.lastchunk_destroy_time) < 5000 )
  2195. continue;
  2196. }
  2197.  
  2198.  
  2199. //hasnt moved 24 inches in 30 seconds?
  2200. if ( DistanceSquared( self.origin, prevorigin ) < 576 )
  2201. {
  2202. // DEBUG HACK
  2203. self dodamage( self.health + 100, (0,0,0) );
  2204. break;
  2205. }
  2206.  
  2207. prevorigin = self.origin;
  2208. }
  2209. //////////////////////////////////////////////////////////////
  2210. //END OF FAILSAFE "hack shit"
  2211. //////////////////////////////////////////////////////////////
  2212. }
  2213.  
  2214. // Waits for the time and the ai to die
  2215. round_wait()
  2216. {
  2217. /#
  2218. if (GetDVarInt("zombie_rise_test"))
  2219. {
  2220. level waittill("forever"); // TESTING: don't advance rounds
  2221. }
  2222. #/
  2223.  
  2224. /#
  2225. if ( GetDVarInt( "zombie_cheat" ) == 2 || GetDVarInt( "zombie_cheat" ) >= 4 )
  2226. {
  2227. level waittill("forever");
  2228. }
  2229. #/
  2230.  
  2231. wait( 1 );
  2232.  
  2233. if( flag("dog_round" ) )
  2234. {
  2235. wait(7);
  2236. while( level.dog_intermission )
  2237. {
  2238. wait(0.5);
  2239. }
  2240. }
  2241. else
  2242. {
  2243. while( get_enemy_count() > 0 || level.zombie_total > 0 || level.intermission)
  2244. {
  2245. wait( 0.5 );
  2246. }
  2247. }
  2248. }
  2249.  
  2250.  
  2251. zombify_player()
  2252. {
  2253. self maps\_zombiemode_score::player_died_penalty();
  2254.  
  2255. if( !IsDefined( level.zombie_vars["zombify_player"] ) || !level.zombie_vars["zombify_player"] )
  2256. {
  2257. self thread spawnSpectator();
  2258. return;
  2259. }
  2260.  
  2261. self.ignoreme = true;
  2262. self.is_zombie = true;
  2263. self.zombification_time = getTime();
  2264.  
  2265. self.team = "axis";
  2266. self notify( "zombified" );
  2267.  
  2268. if( IsDefined( self.revivetrigger ) )
  2269. {
  2270. self.revivetrigger Delete();
  2271. }
  2272. self.revivetrigger = undefined;
  2273.  
  2274. self setMoveSpeedScale( 0.3 );
  2275. self reviveplayer();
  2276.  
  2277. self TakeAllWeapons();
  2278. self starttanning();
  2279. self GiveWeapon( "zombie_melee", 0 );
  2280. self SwitchToWeapon( "zombie_melee" );
  2281. self DisableWeaponCycling();
  2282. self DisableOffhandWeapons();
  2283. self VisionSetNaked( "zombie_turned", 1 );
  2284.  
  2285. maps\_utility::setClientSysState( "zombify", 1, self ); // Zombie grain goooo
  2286.  
  2287. self thread maps\_zombiemode_spawner::zombie_eye_glow();
  2288.  
  2289. // set up the ground ref ent
  2290. self thread injured_walk();
  2291. // allow for zombie attacks, but they lose points?
  2292.  
  2293. self thread playerzombie_player_damage();
  2294. self thread playerzombie_soundboard();
  2295. }
  2296.  
  2297. playerzombie_player_damage()
  2298. {
  2299. self endon( "death" );
  2300. self endon( "disconnect" );
  2301.  
  2302. self thread playerzombie_infinite_health(); // manually keep regular health up
  2303. self.zombiehealth = level.zombie_health;
  2304.  
  2305. // enable PVP damage on this guy
  2306. // self EnablePvPDamage();
  2307.  
  2308. while( 1 )
  2309. {
  2310. self waittill( "damage", amount, attacker, directionVec, point, type );
  2311.  
  2312. if( !IsDefined( attacker ) || !IsPlayer( attacker ) )
  2313. {
  2314. wait( 0.05 );
  2315. continue;
  2316. }
  2317.  
  2318. self.zombiehealth -= amount;
  2319.  
  2320. if( self.zombiehealth <= 0 )
  2321. {
  2322. // "down" the zombie
  2323. self thread playerzombie_downed_state();
  2324. self waittill( "playerzombie_downed_state_done" );
  2325. self.zombiehealth = level.zombie_health;
  2326. }
  2327. }
  2328. }
  2329.  
  2330. playerzombie_downed_state()
  2331. {
  2332. self endon( "death" );
  2333. self endon( "disconnect" );
  2334.  
  2335. downTime = 15;
  2336.  
  2337. startTime = GetTime();
  2338. endTime = startTime +( downTime * 1000 );
  2339.  
  2340. self thread playerzombie_downed_hud();
  2341.  
  2342. self.playerzombie_soundboard_disable = true;
  2343. self thread maps\_zombiemode_spawner::zombie_eye_glow_stop();
  2344. self DisableWeapons();
  2345. self AllowStand( false );
  2346. self AllowCrouch( false );
  2347. self AllowProne( true );
  2348.  
  2349. while( GetTime() < endTime )
  2350. {
  2351. wait( 0.05 );
  2352. }
  2353.  
  2354. self.playerzombie_soundboard_disable = false;
  2355. self thread maps\_zombiemode_spawner::zombie_eye_glow();
  2356. self EnableWeapons();
  2357. self AllowStand( true );
  2358. self AllowCrouch( false );
  2359. self AllowProne( false );
  2360.  
  2361. self notify( "playerzombie_downed_state_done" );
  2362. }
  2363.  
  2364. playerzombie_downed_hud()
  2365. {
  2366. self endon( "death" );
  2367. self endon( "disconnect" );
  2368.  
  2369. text = NewClientHudElem( self );
  2370. text.alignX = "center";
  2371. text.alignY = "middle";
  2372. text.horzAlign = "center";
  2373. text.vertAlign = "bottom";
  2374. text.foreground = true;
  2375. text.font = "default";
  2376. text.fontScale = 1.8;
  2377. text.alpha = 0;
  2378. text.color = ( 1.0, 1.0, 1.0 );
  2379. text SetText( &"ZOMBIE_PLAYERZOMBIE_DOWNED" );
  2380.  
  2381. text.y = -113;
  2382. if( IsSplitScreen() )
  2383. {
  2384. text.y = -137;
  2385. }
  2386.  
  2387. text FadeOverTime( 0.1 );
  2388. text.alpha = 1;
  2389.  
  2390. self waittill( "playerzombie_downed_state_done" );
  2391.  
  2392. text FadeOverTime( 0.1 );
  2393. text.alpha = 0;
  2394. }
  2395.  
  2396. playerzombie_infinite_health()
  2397. {
  2398. self endon( "death" );
  2399. self endon( "disconnect" );
  2400.  
  2401. bighealth = 100000;
  2402.  
  2403. while( 1 )
  2404. {
  2405. if( self.health < bighealth )
  2406. {
  2407. self.health = bighealth;
  2408. }
  2409.  
  2410. wait( 0.1 );
  2411. }
  2412. }
  2413.  
  2414. playerzombie_soundboard()
  2415. {
  2416. self endon( "death" );
  2417. self endon( "disconnect" );
  2418.  
  2419. self.playerzombie_soundboard_disable = false;
  2420.  
  2421. self.buttonpressed_use = false;
  2422. self.buttonpressed_attack = false;
  2423. self.buttonpressed_ads = false;
  2424.  
  2425. self.useSound_waitTime = 3 * 1000; // milliseconds
  2426. self.useSound_nextTime = GetTime();
  2427. useSound = "playerzombie_usebutton_sound";
  2428.  
  2429. self.attackSound_waitTime = 3 * 1000;
  2430. self.attackSound_nextTime = GetTime();
  2431. attackSound = "playerzombie_attackbutton_sound";
  2432.  
  2433. self.adsSound_waitTime = 3 * 1000;
  2434. self.adsSound_nextTime = GetTime();
  2435. adsSound = "playerzombie_adsbutton_sound";
  2436.  
  2437. self.inputSound_nextTime = GetTime(); // don't want to be able to do all sounds at once
  2438.  
  2439. while( 1 )
  2440. {
  2441. if( self.playerzombie_soundboard_disable )
  2442. {
  2443. wait( 0.05 );
  2444. continue;
  2445. }
  2446.  
  2447. if( self UseButtonPressed() )
  2448. {
  2449. if( self can_do_input( "use" ) )
  2450. {
  2451. self thread playerzombie_play_sound( useSound );
  2452. self thread playerzombie_waitfor_buttonrelease( "use" );
  2453. self.useSound_nextTime = GetTime() + self.useSound_waitTime;
  2454. }
  2455. }
  2456. else if( self AttackButtonPressed() )
  2457. {
  2458. if( self can_do_input( "attack" ) )
  2459. {
  2460. self thread playerzombie_play_sound( attackSound );
  2461. self thread playerzombie_waitfor_buttonrelease( "attack" );
  2462. self.attackSound_nextTime = GetTime() + self.attackSound_waitTime;
  2463. }
  2464. }
  2465. else if( self AdsButtonPressed() )
  2466. {
  2467. if( self can_do_input( "ads" ) )
  2468. {
  2469. self thread playerzombie_play_sound( adsSound );
  2470. self thread playerzombie_waitfor_buttonrelease( "ads" );
  2471. self.adsSound_nextTime = GetTime() + self.adsSound_waitTime;
  2472. }
  2473. }
  2474.  
  2475. wait( 0.05 );
  2476. }
  2477. }
  2478.  
  2479. can_do_input( inputType )
  2480. {
  2481. if( GetTime() < self.inputSound_nextTime )
  2482. {
  2483. return false;
  2484. }
  2485.  
  2486. canDo = false;
  2487.  
  2488. switch( inputType )
  2489. {
  2490. case "use":
  2491. if( GetTime() >= self.useSound_nextTime && !self.buttonpressed_use )
  2492. {
  2493. canDo = true;
  2494. }
  2495. break;
  2496.  
  2497. case "attack":
  2498. if( GetTime() >= self.attackSound_nextTime && !self.buttonpressed_attack )
  2499. {
  2500. canDo = true;
  2501. }
  2502. break;
  2503.  
  2504. case "ads":
  2505. if( GetTime() >= self.useSound_nextTime && !self.buttonpressed_ads )
  2506. {
  2507. canDo = true;
  2508. }
  2509. break;
  2510.  
  2511. default:
  2512. ASSERTMSG( "can_do_input(): didn't recognize inputType of " + inputType );
  2513. break;
  2514. }
  2515.  
  2516. return canDo;
  2517. }
  2518.  
  2519. playerzombie_play_sound( alias )
  2520. {
  2521. self play_sound_on_ent( alias );
  2522. }
  2523.  
  2524. playerzombie_waitfor_buttonrelease( inputType )
  2525. {
  2526. if( inputType != "use" && inputType != "attack" && inputType != "ads" )
  2527. {
  2528. ASSERTMSG( "playerzombie_waitfor_buttonrelease(): inputType of " + inputType + " is not recognized." );
  2529. return;
  2530. }
  2531.  
  2532. notifyString = "waitfor_buttonrelease_" + inputType;
  2533. self notify( notifyString );
  2534. self endon( notifyString );
  2535.  
  2536. if( inputType == "use" )
  2537. {
  2538. self.buttonpressed_use = true;
  2539. while( self UseButtonPressed() )
  2540. {
  2541. wait( 0.05 );
  2542. }
  2543. self.buttonpressed_use = false;
  2544. }
  2545.  
  2546. else if( inputType == "attack" )
  2547. {
  2548. self.buttonpressed_attack = true;
  2549. while( self AttackButtonPressed() )
  2550. {
  2551. wait( 0.05 );
  2552. }
  2553. self.buttonpressed_attack = false;
  2554. }
  2555.  
  2556. else if( inputType == "ads" )
  2557. {
  2558. self.buttonpressed_ads = true;
  2559. while( self AdsButtonPressed() )
  2560. {
  2561. wait( 0.05 );
  2562. }
  2563. self.buttonpressed_ads = false;
  2564. }
  2565. }
  2566.  
  2567. remove_ignore_attacker()
  2568. {
  2569. self notify( "new_ignore_attacker" );
  2570. self endon( "new_ignore_attacker" );
  2571. self endon( "disconnect" );
  2572.  
  2573. if( !isDefined( level.ignore_enemy_timer ) )
  2574. {
  2575. level.ignore_enemy_timer = 0.4;
  2576. }
  2577.  
  2578. wait( level.ignore_enemy_timer );
  2579.  
  2580. self.ignoreAttacker = undefined;
  2581. }
  2582.  
  2583. player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
  2584. {
  2585. if(self hasperk("specialty_detectexplosive") && (sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_GRENADE_SPLASH" || sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_EXPLOSIVE"))
  2586. {
  2587. self enableInvulnerability();
  2588. iDamage = 0;
  2589. }
  2590.  
  2591. /*
  2592. if(self hasperk("specialty_armorvest") && eAttacker != self)
  2593. {
  2594. iDamage = iDamage * 0.75;
  2595. iprintlnbold(idamage);
  2596. }*/
  2597.  
  2598. if( sMeansOfDeath == "MOD_FALLING" )
  2599. {
  2600. sMeansOfDeath = "MOD_EXPLOSIVE";
  2601. }
  2602.  
  2603. if( isDefined( eAttacker ) )
  2604. {
  2605. if( isDefined( self.ignoreAttacker ) && self.ignoreAttacker == eAttacker )
  2606. {
  2607. return;
  2608. }
  2609.  
  2610. if( isDefined( eAttacker.is_zombie ) && eAttacker.is_zombie )
  2611. {
  2612. self.ignoreAttacker = eAttacker;
  2613. self thread remove_ignore_attacker();
  2614. }
  2615.  
  2616. if( isDefined( eAttacker.damage_mult ) )
  2617. {
  2618. iDamage *= eAttacker.damage_mult;
  2619. }
  2620. eAttacker notify( "hit_player" );
  2621. }
  2622. finalDamage = iDamage;
  2623.  
  2624. if( sMeansOfDeath == "MOD_PROJECTILE" || sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" )
  2625. {
  2626. if( self.health > 75 )
  2627. {
  2628. finalDamage = 75;
  2629. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2630. return;
  2631. }
  2632. }
  2633.  
  2634. if( iDamage < self.health )
  2635. {
  2636. if ( IsDefined( eAttacker ) )
  2637. {
  2638. eAttacker.sound_damage_player = self;
  2639. }
  2640.  
  2641. //iprintlnbold(iDamage);
  2642. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2643. return;
  2644. }
  2645. if( level.intermission )
  2646. {
  2647. level waittill( "forever" );
  2648. }
  2649.  
  2650. players = get_players();
  2651. count = 0;
  2652. for( i = 0; i < players.size; i++ )
  2653. {
  2654. if( players[i] == self || players[i].is_zombie || players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator" )
  2655. {
  2656. count++;
  2657. }
  2658. }
  2659.  
  2660. if( count < players.size )
  2661. {
  2662. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2663. return;
  2664. }
  2665.  
  2666. if(players.size == 1)
  2667. {
  2668. self.intermission = true;
  2669.  
  2670. self.revive = false;
  2671. if((self hasperk("specialty_quickrevive")) && players.size == 1)
  2672. self.revive = true;
  2673.  
  2674. self thread maps\_laststand::PlayerLastStand( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime );
  2675.  
  2676. if(self.revive == true)
  2677. self player_revive_death();
  2678. else
  2679. self player_fake_death();
  2680.  
  2681. if(count == players.size)
  2682. {
  2683. if(players.size == 1 && self.revive == false)
  2684. level notify( "end_game" );
  2685. if(players.size != 1)
  2686. level notify( "end_game" );
  2687. }
  2688. else
  2689. {
  2690. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2691. }
  2692. }
  2693. else
  2694. {
  2695.  
  2696. self.being_revived = false;
  2697.  
  2698. self.intermission = true;
  2699.  
  2700. self thread maps\_laststand::PlayerLastStand( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime );
  2701. self player_fake_death();
  2702.  
  2703. if(count == players.size)
  2704. {
  2705. level notify( "end_game" );
  2706. }
  2707. else
  2708. {
  2709. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2710. }
  2711. }
  2712. self disableinvulnerability();
  2713. }
  2714.  
  2715. player_revive_death()
  2716. {
  2717.  
  2718. primaryWeapons = self GetWeaponsListPrimaries();
  2719.  
  2720. if(primaryWeapons.size == 3)
  2721. {
  2722. self TakeWeapon(primaryWeapons[2]);
  2723. self SwitchToWeapon(primaryWeapons[0]);
  2724. }
  2725.  
  2726. self.being_revived = true;
  2727.  
  2728. level notify ("fake_death");
  2729. self notify ("fake_death");
  2730.  
  2731. //self TakeAllWeapons();
  2732.  
  2733. iprintlnbold ("reviving player");
  2734.  
  2735. z_interest = getent("revive_retreat_point","targetname");
  2736.  
  2737. z_interest create_zombie_point_of_interest( 1536, 96, 10000, true );
  2738.  
  2739. gun_downed = self GetCurrentWeapon();
  2740.  
  2741. self.had_pistol_upgraded = true;
  2742.  
  2743. if(!(self hasweapon("zombie_colt_upgraded")))
  2744. {
  2745. self giveWeapon("zombie_colt_upgraded");
  2746. self.had_pistol_upgraded = false;
  2747. }
  2748.  
  2749. self SwitchToWeapon( "zombie_colt_upgraded" );
  2750.  
  2751. self DisableWeaponCycling();
  2752.  
  2753. VisionSetNaked( "laststand", 1 );
  2754.  
  2755. self AllowStand( false );
  2756. self AllowCrouch( false );
  2757. self AllowSprint(false);
  2758. self AllowProne( true );
  2759.  
  2760. self.ignoreme = true;
  2761. self EnableInvulnerability();
  2762.  
  2763. self.inStand = true;
  2764.  
  2765. wait 8;
  2766.  
  2767. self.inStand = false;
  2768.  
  2769. self EnableWeaponCycling();
  2770.  
  2771. if(self.had_pistol_upgraded == false)
  2772. self TakeWeapon( "zombie_colt_upgraded" );
  2773.  
  2774. self SwitchToWeapon(gun_downed);
  2775.  
  2776. z_interest create_zombie_point_of_interest( 0, 0, 0, false );
  2777.  
  2778. VisionSetNaked( "zombie_factory", 1 );
  2779.  
  2780. self AllowStand( true );
  2781. self AllowCrouch( true );
  2782. self AllowProne( true );
  2783. self AllowSprint(true);
  2784.  
  2785. self SetStance( "stand" );
  2786.  
  2787. self.ignoreme = false;
  2788. self DisableInvulnerability();
  2789.  
  2790. self.being_revived = false;
  2791. }
  2792.  
  2793. end_game()
  2794. {
  2795. level waittill ( "end_game" );
  2796.  
  2797. level.intermission = true;
  2798.  
  2799. update_leaderboards();
  2800.  
  2801. game_over = NewHudElem( self );
  2802. game_over.alignX = "center";
  2803. game_over.alignY = "middle";
  2804. game_over.horzAlign = "center";
  2805. game_over.vertAlign = "middle";
  2806. game_over.y -= 10;
  2807. game_over.foreground = true;
  2808. game_over.fontScale = 3;
  2809. game_over.alpha = 0;
  2810. game_over.color = ( 1.0, 1.0, 1.0 );
  2811. game_over SetText( &"ZOMBIE_GAME_OVER" );
  2812.  
  2813. game_over FadeOverTime( 1 );
  2814. game_over.alpha = 1;
  2815.  
  2816. survived = NewHudElem( self );
  2817. survived.alignX = "center";
  2818. survived.alignY = "middle";
  2819. survived.horzAlign = "center";
  2820. survived.vertAlign = "middle";
  2821. survived.y += 20;
  2822. survived.foreground = true;
  2823. survived.fontScale = 2;
  2824. survived.alpha = 0;
  2825. survived.color = ( 1.0, 1.0, 1.0 );
  2826.  
  2827. if( level.round_number < 2 )
  2828. {
  2829. survived SetText( &"ZOMBIE_SURVIVED_ROUND" );
  2830. }
  2831. else
  2832. {
  2833. survived SetText( &"ZOMBIE_SURVIVED_ROUNDS", level.round_number );
  2834. }
  2835. //TUEY had to change this since we are adding other musical elements
  2836. setmusicstate("end_of_game");
  2837. setbusstate("default");
  2838.  
  2839. survived FadeOverTime( 1 );
  2840. survived.alpha = 1;
  2841.  
  2842. wait( 1 );
  2843.  
  2844. //play_sound_at_pos( "end_of_game", ( 0, 0, 0 ) );
  2845. wait( 2 );
  2846. intermission();
  2847.  
  2848. wait( level.zombie_vars["zombie_intermission_time"] );
  2849.  
  2850. level notify( "stop_intermission" );
  2851. array_thread( get_players(), ::player_exit_level );
  2852.  
  2853. bbPrint( "zombie_epilogs: rounds %d", level.round_number );
  2854.  
  2855. wait( 1.5 );
  2856.  
  2857. if( is_coop() )
  2858. {
  2859. ExitLevel( false );
  2860. }
  2861. else
  2862. {
  2863. MissionFailed();
  2864. }
  2865.  
  2866.  
  2867.  
  2868. // Let's not exit the function
  2869. wait( 666 );
  2870. }
  2871.  
  2872. update_leaderboards()
  2873. {
  2874. if( level.systemLink || IsSplitScreen() )
  2875. {
  2876. return;
  2877. }
  2878.  
  2879. nazizombies_upload_highscore();
  2880. nazizombies_set_new_zombie_stats();
  2881. }
  2882.  
  2883. player_fake_death()
  2884. {
  2885. level notify ("fake_death");
  2886. self notify ("fake_death");
  2887.  
  2888. self TakeAllWeapons();
  2889. self AllowStand( false );
  2890. self AllowCrouch( false );
  2891. self AllowProne( true );
  2892.  
  2893. self.ignoreme = true;
  2894. self EnableInvulnerability();
  2895.  
  2896. wait( 1 );
  2897. self FreezeControls( true );
  2898. }
  2899.  
  2900. player_exit_level()
  2901. {
  2902. self AllowStand( true );
  2903. self AllowCrouch( false );
  2904. self AllowProne( false );
  2905.  
  2906. if( IsDefined( self.game_over_bg ) )
  2907. {
  2908. self.game_over_bg.foreground = true;
  2909. self.game_over_bg.sort = 100;
  2910. self.game_over_bg FadeOverTime( 1 );
  2911. self.game_over_bg.alpha = 1;
  2912. }
  2913. }
  2914.  
  2915. player_killed_override()
  2916. {
  2917. // BLANK
  2918. level waittill( "forever" );
  2919. }
  2920.  
  2921.  
  2922. injured_walk()
  2923. {
  2924. self.ground_ref_ent = Spawn( "script_model", ( 0, 0, 0 ) );
  2925.  
  2926. self.player_speed = 50;
  2927.  
  2928. // TODO do death countdown
  2929. self AllowSprint( false );
  2930. self AllowProne( false );
  2931. self AllowCrouch( false );
  2932. self AllowAds( false );
  2933. self AllowJump( false );
  2934.  
  2935. self PlayerSetGroundReferenceEnt( self.ground_ref_ent );
  2936. self thread limp();
  2937. }
  2938.  
  2939. limp()
  2940. {
  2941. level endon( "disconnect" );
  2942. level endon( "death" );
  2943. // TODO uncomment when/if SetBlur works again
  2944. //self thread player_random_blur();
  2945.  
  2946. stumble = 0;
  2947. alt = 0;
  2948.  
  2949. while( 1 )
  2950. {
  2951. velocity = self GetVelocity();
  2952. player_speed = abs( velocity[0] ) + abs( velocity[1] );
  2953.  
  2954. if( player_speed < 10 )
  2955. {
  2956. wait( 0.05 );
  2957. continue;
  2958. }
  2959.  
  2960. speed_multiplier = player_speed / self.player_speed;
  2961.  
  2962. p = RandomFloatRange( 3, 5 );
  2963. if( RandomInt( 100 ) < 20 )
  2964. {
  2965. p *= 3;
  2966. }
  2967. r = RandomFloatRange( 3, 7 );
  2968. y = RandomFloatRange( -8, -2 );
  2969.  
  2970. stumble_angles = ( p, y, r );
  2971. stumble_angles = vector_multiply( stumble_angles, speed_multiplier );
  2972.  
  2973. stumble_time = RandomFloatRange( .35, .45 );
  2974. recover_time = RandomFloatRange( .65, .8 );
  2975.  
  2976. stumble++;
  2977. if( speed_multiplier > 1.3 )
  2978. {
  2979. stumble++;
  2980. }
  2981.  
  2982. self thread stumble( stumble_angles, stumble_time, recover_time );
  2983.  
  2984. level waittill( "recovered" );
  2985. }
  2986. }
  2987.  
  2988. stumble( stumble_angles, stumble_time, recover_time, no_notify )
  2989. {
  2990. stumble_angles = self adjust_angles_to_player( stumble_angles );
  2991.  
  2992. self.ground_ref_ent RotateTo( stumble_angles, stumble_time, ( stumble_time/4*3 ), ( stumble_time/4 ) );
  2993. self.ground_ref_ent waittill( "rotatedone" );
  2994.  
  2995. base_angles = ( RandomFloat( 4 ) - 4, RandomFloat( 5 ), 0 );
  2996. base_angles = self adjust_angles_to_player( base_angles );
  2997.  
  2998. self.ground_ref_ent RotateTo( base_angles, recover_time, 0, ( recover_time / 2 ) );
  2999. self.ground_ref_ent waittill( "rotatedone" );
  3000.  
  3001. if( !IsDefined( no_notify ) )
  3002. {
  3003. level notify( "recovered" );
  3004. }
  3005. }
  3006.  
  3007. adjust_angles_to_player( stumble_angles )
  3008. {
  3009. pa = stumble_angles[0];
  3010. ra = stumble_angles[2];
  3011.  
  3012. rv = AnglesToRight( self.angles );
  3013. fv = AnglesToForward( self.angles );
  3014.  
  3015. rva = ( rv[0], 0, rv[1]*-1 );
  3016. fva = ( fv[0], 0, fv[1]*-1 );
  3017. angles = vector_multiply( rva, pa );
  3018. angles = angles + vector_multiply( fva, ra );
  3019. return angles +( 0, stumble_angles[1], 0 );
  3020. }
  3021.  
  3022. coop_player_spawn_placement()
  3023. {
  3024. structs = getstructarray( "initial_spawn_points", "targetname" );
  3025.  
  3026. flag_wait( "all_players_connected" );
  3027.  
  3028. //chrisp - adding support for overriding the default spawning method
  3029.  
  3030. players = get_players();
  3031.  
  3032. for( i = 0; i < players.size; i++ )
  3033. {
  3034. players[i] setorigin( structs[i].origin );
  3035. players[i] setplayerangles( structs[i].angles );
  3036. players[i].spectator_respawn = structs[i];
  3037. }
  3038. }
  3039.  
  3040.  
  3041. player_zombie_breadcrumb()
  3042. {
  3043. self endon( "disconnect" );
  3044. self endon( "spawned_spectator" );
  3045. level endon( "intermission" );
  3046.  
  3047. self.zombie_breadcrumbs = [];
  3048. self.zombie_breadcrumb_distance = 24 * 24; // min dist (squared) the player must move to drop a crumb
  3049. self.zombie_breadcrumb_area_num = 3; // the number of "rings" the area breadcrumbs use
  3050. self.zombie_breadcrumb_area_distance = 16; // the distance between each "ring" of the area breadcrumbs
  3051.  
  3052. self store_crumb( self.origin );
  3053. last_crumb = self.origin;
  3054.  
  3055. self thread debug_breadcrumbs();
  3056.  
  3057. while( 1 )
  3058. {
  3059. wait_time = 0.1;
  3060.  
  3061. /#
  3062. if( self isnotarget() )
  3063. {
  3064. wait( wait_time );
  3065. continue;
  3066. }
  3067. #/
  3068.  
  3069. store_crumb = true;
  3070. airborne = false;
  3071. crumb = self.origin;
  3072.  
  3073. if ( !self IsOnGround() )
  3074. {
  3075. airborne = true;
  3076. store_crumb = false;
  3077. wait_time = 0.05;
  3078. }
  3079.  
  3080. if( !airborne && DistanceSquared( crumb, last_crumb ) < self.zombie_breadcrumb_distance )
  3081. {
  3082. store_crumb = false;
  3083. }
  3084.  
  3085. if ( airborne && self IsOnGround() )
  3086. {
  3087. // player was airborne, store crumb now that he's on the ground
  3088. store_crumb = true;
  3089. airborne = false;
  3090. }
  3091.  
  3092. // PI_CHANGE_BEGIN
  3093. // JMA - we don't need to store new crumbs, the zipline will store our destination as a crumb
  3094. if( (isDefined(level.script) && level.script == "nazi_zombie_sumpf" && (isDefined(self.on_zipline) && self.on_zipline == true)) )
  3095. {
  3096. airborne = false;
  3097. store_crumb = false;
  3098. }
  3099. // PI_CHANGE_END
  3100.  
  3101. if( store_crumb )
  3102. {
  3103. debug_print( "Player is storing breadcrumb " + crumb );
  3104. last_crumb = crumb;
  3105. self store_crumb( crumb );
  3106. }
  3107.  
  3108. wait( wait_time );
  3109. }
  3110. }
  3111.  
  3112.  
  3113. store_crumb( origin )
  3114. {
  3115. offsets = [];
  3116. height_offset = 32;
  3117.  
  3118. index = 0;
  3119. for( j = 1; j <= self.zombie_breadcrumb_area_num; j++ )
  3120. {
  3121. offset = ( j * self.zombie_breadcrumb_area_distance );
  3122.  
  3123. offsets[0] = ( origin[0] - offset, origin[1], origin[2] );
  3124. offsets[1] = ( origin[0] + offset, origin[1], origin[2] );
  3125. offsets[2] = ( origin[0], origin[1] - offset, origin[2] );
  3126. offsets[3] = ( origin[0], origin[1] + offset, origin[2] );
  3127.  
  3128. offsets[4] = ( origin[0] - offset, origin[1], origin[2] + height_offset );
  3129. offsets[5] = ( origin[0] + offset, origin[1], origin[2] + height_offset );
  3130. offsets[6] = ( origin[0], origin[1] - offset, origin[2] + height_offset );
  3131. offsets[7] = ( origin[0], origin[1] + offset, origin[2] + height_offset );
  3132.  
  3133. for ( i = 0; i < offsets.size; i++ )
  3134. {
  3135. self.zombie_breadcrumbs[index] = offsets[i];
  3136. index++;
  3137. }
  3138. }
  3139. }
  3140.  
  3141.  
  3142. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3143. /////////////////////////////////////////////////LEADERBOARD CODE///////////////////////////////////////////////////////////
  3144. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3145.  
  3146. //CODER MOD: TOMMY K
  3147. nazizombies_upload_highscore()
  3148. {
  3149. // Nazi Zombie Leaderboards
  3150. // nazi_zombie_prototype_waves = 13
  3151. // nazi_zombie_prototype_points = 14
  3152.  
  3153. // this has gotta be the dumbest way of doing this, but at 1:33am in the morning my brain is fried!
  3154. playersRank = 1;
  3155. if( level.players_playing == 1 )
  3156. playersRank = 4;
  3157. else if( level.players_playing == 2 )
  3158. playersRank = 3;
  3159. else if( level.players_playing == 3 )
  3160. playersRank = 2;
  3161.  
  3162. map_name = GetDvar( "mapname" );
  3163.  
  3164. if ( !isZombieLeaderboardAvailable( map_name, "waves" ) || !isZombieLeaderboardAvailable( map_name, "points" ) )
  3165. return;
  3166.  
  3167. players = get_players();
  3168. for( i = 0; i < players.size; i++ )
  3169. {
  3170. pre_highest_wave = players[i] playerZombieStatGet( map_name, "highestwave" );
  3171. pre_time_in_wave = players[i] playerZombieStatGet( map_name, "timeinwave" );
  3172.  
  3173. new_highest_wave = level.round_number + "" + playersRank;
  3174. new_highest_wave = int( new_highest_wave );
  3175.  
  3176. if( new_highest_wave >= pre_highest_wave )
  3177. {
  3178. if( players[i].zombification_time == 0 )
  3179. {
  3180. players[i].zombification_time = getTime();
  3181. }
  3182.  
  3183. player_survival_time = players[i].zombification_time - level.round_start_time;
  3184. player_survival_time = int( player_survival_time/1000 );
  3185.  
  3186. if( new_highest_wave > pre_highest_wave || player_survival_time > pre_time_in_wave )
  3187. {
  3188. rankNumber = makeRankNumber( level.round_number, playersRank, player_survival_time );
  3189.  
  3190. leaderboard_number = getZombieLeaderboardNumber( map_name, "waves" );
  3191.  
  3192. players[i] UploadScore( leaderboard_number, int(rankNumber), level.round_number, player_survival_time, level.players_playing );
  3193. //players[i] UploadScore( leaderboard_number, int(rankNumber), level.round_number );
  3194.  
  3195. players[i] playerZombieStatSet( map_name, "highestwave", new_highest_wave );
  3196. players[i] playerZombieStatSet( map_name, "timeinwave", player_survival_time );
  3197. }
  3198. }
  3199.  
  3200. pre_total_points = players[i] playerZombieStatGet( map_name, "totalpoints" );
  3201. if( players[i].score_total > pre_total_points )
  3202. {
  3203. leaderboard_number = getZombieLeaderboardNumber( map_name, "points" );
  3204.  
  3205. players[i] UploadScore( leaderboard_number, players[i].score_total, players[i].kills, level.players_playing );
  3206.  
  3207. players[i] playerZombieStatSet( map_name, "totalpoints", players[i].score_total );
  3208. }
  3209. }
  3210. }
  3211.  
  3212. isZombieLeaderboardAvailable( map, type )
  3213. {
  3214. if ( !isDefined( level.zombieLeaderboardNumber[map] ) )
  3215. return 0;
  3216.  
  3217. if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) )
  3218. return 0;
  3219.  
  3220. return 1;
  3221. }
  3222.  
  3223. getZombieLeaderboardNumber( map, type )
  3224. {
  3225. if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) )
  3226. assertMsg( "Unknown leaderboard number for map " + map + "and type " + type );
  3227.  
  3228. return level.zombieLeaderboardNumber[map][type];
  3229. }
  3230.  
  3231. getZombieStatVariable( map, variable )
  3232. {
  3233. if ( !isDefined( level.zombieLeaderboardStatVariable[map][variable] ) )
  3234. assertMsg( "Unknown stat variable " + variable + " for map " + map );
  3235.  
  3236. return level.zombieLeaderboardStatVariable[map][variable];
  3237. }
  3238.  
  3239. playerZombieStatGet( map, variable )
  3240. {
  3241. stat_variable = getZombieStatVariable( map, variable );
  3242. result = self zombieStatGet( stat_variable );
  3243.  
  3244. return result;
  3245. }
  3246.  
  3247. playerZombieStatSet( map, variable, value )
  3248. {
  3249. stat_variable = getZombieStatVariable( map, variable );
  3250. self zombieStatSet( stat_variable, value );
  3251. }
  3252.  
  3253. nazizombies_set_new_zombie_stats()
  3254. {
  3255. players = get_players();
  3256. for( i = 0; i < players.size; i++ )
  3257. {
  3258. //grab stat and add final totals
  3259. total_kills = players[i] zombieStatGet( "zombie_kills" ) + players[i].stats["kills"];
  3260. total_points = players[i] zombieStatGet( "zombie_points" ) + players[i].stats["score"];
  3261. total_rounds = players[i] zombieStatGet( "zombie_rounds" ) + (level.round_number - 1); // rounds survived
  3262. total_downs = players[i] zombieStatGet( "zombie_downs" ) + players[i].stats["downs"];
  3263. total_revives = players[i] zombieStatGet( "zombie_revives" ) + players[i].stats["revives"];
  3264. total_perks = players[i] zombieStatGet( "zombie_perks_consumed" ) + players[i].stats["perks"];
  3265. total_headshots = players[i] zombieStatGet( "zombie_heashots" ) + players[i].stats["headshots"];
  3266. total_zombie_gibs = players[i] zombieStatGet( "zombie_gibs" ) + players[i].stats["zombie_gibs"];
  3267.  
  3268. //set zombie stats
  3269. players[i] zombieStatSet( "zombie_kills", total_kills );
  3270. players[i] zombieStatSet( "zombie_points", total_points );
  3271. players[i] zombieStatSet( "zombie_rounds", total_rounds );
  3272. players[i] zombieStatSet( "zombie_downs", total_downs );
  3273. players[i] zombieStatSet( "zombie_revives", total_revives );
  3274. players[i] zombieStatSet( "zombie_perks_consumed", total_perks );
  3275. players[i] zombieStatSet( "zombie_heashots", total_headshots );
  3276. players[i] zombieStatSet( "zombie_gibs", total_zombie_gibs );
  3277. }
  3278. }
  3279.  
  3280. makeRankNumber( wave, players, time )
  3281. {
  3282. if( time > 86400 )
  3283. time = 86400; // cap it at like 1 day, need to cap cause you know some muppet is gonna end up trying it
  3284.  
  3285. //pad out time
  3286. padding = "";
  3287. if ( 10 > time )
  3288. padding += "0000";
  3289. else if( 100 > time )
  3290. padding += "000";
  3291. else if( 1000 > time )
  3292. padding += "00";
  3293. else if( 10000 > time )
  3294. padding += "0";
  3295.  
  3296. rank = wave + "" + players + padding + time;
  3297.  
  3298. return rank;
  3299. }
  3300.  
  3301.  
  3302. //CODER MOD: TOMMY K
  3303. /*
  3304. =============
  3305. statGet
  3306.  
  3307. Returns the value of the named stat
  3308. =============
  3309. */
  3310. zombieStatGet( dataName )
  3311. {
  3312. if( level.systemLink || true == IsSplitScreen() )
  3313. {
  3314. return;
  3315. }
  3316.  
  3317. return self getStat( int(tableLookup( "mp/playerStatsTable.csv", 1, dataName, 0 )) );
  3318. }
  3319.  
  3320. //CODER MOD: TOMMY K
  3321. /*
  3322. =============
  3323. setStat
  3324.  
  3325. Sets the value of the named stat
  3326. =============
  3327. */
  3328. zombieStatSet( dataName, value )
  3329. {
  3330. if( level.systemLink || true == IsSplitScreen() )
  3331. {
  3332. return;
  3333. }
  3334.  
  3335. self setStat( int(tableLookup( "mp/playerStatsTable.csv", 1, dataName, 0 )), value );
  3336. }
  3337.  
  3338.  
  3339. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3340. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3341. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3342.  
  3343. //
  3344. // INTERMISSION =========================================================== //
  3345. //
  3346.  
  3347. intermission()
  3348. {
  3349. level.intermission = true;
  3350. level notify( "intermission" );
  3351.  
  3352. players = get_players();
  3353. for( i = 0; i < players.size; i++ )
  3354. {
  3355. setclientsysstate( "levelNotify", "zi", players[i] ); // Tell clientscripts we're in zombie intermission
  3356.  
  3357. players[i] SetClientDvars( "cg_thirdPerson", "0",
  3358. "cg_fov", "65" );
  3359.  
  3360. players[i].health = 100; // This is needed so the player view doesn't get stuck
  3361. players[i] thread [[level.custom_intermission]]();
  3362. }
  3363.  
  3364. wait( 0.25 );
  3365.  
  3366. // Delay the last stand monitor so we are 100% sure the zombie intermission ("zi") is set on the cients
  3367. players = get_players();
  3368. for( i = 0; i < players.size; i++ )
  3369. {
  3370. setClientSysState( "lsm", "1", players[i] );
  3371. }
  3372.  
  3373. visionset = "zombie";
  3374. if( IsDefined( level.zombie_vars["intermission_visionset"] ) )
  3375. {
  3376. visionset = level.zombie_vars["intermission_visionset"];
  3377. }
  3378.  
  3379. level thread maps\_utility::set_all_players_visionset( visionset, 2 );
  3380. level thread zombie_game_over_death();
  3381. }
  3382.  
  3383. zombie_game_over_death()
  3384. {
  3385. // Kill remaining zombies, in style!
  3386. zombies = GetAiArray( "axis" );
  3387. for( i = 0; i < zombies.size; i++ )
  3388. {
  3389. if( !IsAlive( zombies[i] ) )
  3390. {
  3391. continue;
  3392. }
  3393.  
  3394. zombies[i] SetGoalPos( zombies[i].origin );
  3395. }
  3396.  
  3397. for( i = 0; i < zombies.size; i++ )
  3398. {
  3399. if( !IsAlive( zombies[i] ) )
  3400. {
  3401. continue;
  3402. }
  3403.  
  3404. wait( 0.5 + RandomFloat( 2 ) );
  3405.  
  3406. zombies[i] maps\_zombiemode_spawner::zombie_head_gib();
  3407. zombies[i] DoDamage( zombies[i].health + 666, zombies[i].origin );
  3408. }
  3409. }
  3410.  
  3411. player_intermission()
  3412. {
  3413. self closeMenu();
  3414. self closeInGameMenu();
  3415.  
  3416. level endon( "stop_intermission" );
  3417. self endon("disconnect");
  3418. self endon("death");
  3419.  
  3420. //Show total gained point for end scoreboard and lobby
  3421. self.score = self.score_total;
  3422.  
  3423. self.sessionstate = "intermission";
  3424. self.spectatorclient = -1;
  3425. self.killcamentity = -1;
  3426. self.archivetime = 0;
  3427. self.psoffsettime = 0;
  3428. self.friendlydamage = undefined;
  3429.  
  3430. points = getstructarray( "intermission", "targetname" );
  3431.  
  3432. if( !IsDefined( points ) || points.size == 0 )
  3433. {
  3434. points = getentarray( "info_intermission", "classname" );
  3435. if( points.size < 1 )
  3436. {
  3437. println( "NO info_intermission POINTS IN MAP" );
  3438. return;
  3439. }
  3440. }
  3441.  
  3442. self.game_over_bg = NewClientHudelem( self );
  3443. self.game_over_bg.horzAlign = "fullscreen";
  3444. self.game_over_bg.vertAlign = "fullscreen";
  3445. self.game_over_bg SetShader( "black", 640, 480 );
  3446. self.game_over_bg.alpha = 1;
  3447.  
  3448. org = undefined;
  3449. while( 1 )
  3450. {
  3451. points = array_randomize( points );
  3452. for( i = 0; i < points.size; i++ )
  3453. {
  3454. point = points[i];
  3455. // Only spawn once if we are using 'moving' org
  3456. // If only using info_intermissions, this will respawn after 5 seconds.
  3457. if( !IsDefined( org ) )
  3458. {
  3459. self Spawn( point.origin, point.angles );
  3460. }
  3461.  
  3462. // Only used with STRUCTS
  3463. if( IsDefined( points[i].target ) )
  3464. {
  3465. if( !IsDefined( org ) )
  3466. {
  3467. org = Spawn( "script_origin", self.origin + ( 0, 0, -60 ) );
  3468. }
  3469.  
  3470. self LinkTo( org, "", ( 0, 0, -60 ), ( 0, 0, 0 ) );
  3471. self SetPlayerAngles( points[i].angles );
  3472. org.origin = points[i].origin;
  3473.  
  3474. speed = 20;
  3475. if( IsDefined( points[i].speed ) )
  3476. {
  3477. speed = points[i].speed;
  3478. }
  3479.  
  3480. target_point = getstruct( points[i].target, "targetname" );
  3481. dist = Distance( points[i].origin, target_point.origin );
  3482. time = dist / speed;
  3483.  
  3484. q_time = time * 0.25;
  3485. if( q_time > 1 )
  3486. {
  3487. q_time = 1;
  3488. }
  3489.  
  3490. self.game_over_bg FadeOverTime( q_time );
  3491. self.game_over_bg.alpha = 0;
  3492.  
  3493. org MoveTo( target_point.origin, time, q_time, q_time );
  3494. org RotateTo( target_point.angles, time, q_time, q_time );
  3495. wait( time - q_time );
  3496.  
  3497. self.game_over_bg FadeOverTime( q_time );
  3498. self.game_over_bg.alpha = 1;
  3499.  
  3500. wait( q_time );
  3501. }
  3502. else
  3503. {
  3504. self.game_over_bg FadeOverTime( 1 );
  3505. self.game_over_bg.alpha = 0;
  3506.  
  3507. wait( 5 );
  3508.  
  3509. self.game_over_bg FadeOverTime( 1 );
  3510. self.game_over_bg.alpha = 1;
  3511.  
  3512. wait( 1 );
  3513. }
  3514. }
  3515. }
  3516. }
  3517.  
  3518. prevent_near_origin()
  3519. {
  3520. while (1)
  3521. {
  3522. players = get_players();
  3523.  
  3524. for (i = 0; i < players.size; i++)
  3525. {
  3526. for (q = 0; q < players.size; q++)
  3527. {
  3528. if (players[i] != players[q])
  3529. {
  3530. if (check_to_kill_near_origin(players[i], players[q]))
  3531. {
  3532. p1_org = players[i].origin;
  3533. p2_org = players[q].origin;
  3534.  
  3535. wait 5;
  3536.  
  3537. if (check_to_kill_near_origin(players[i], players[q]))
  3538. {
  3539. if ( (distance(players[i].origin, p1_org) < 30) && distance(players[q].origin, p2_org) < 30)
  3540. {
  3541. setsaveddvar("player_deathInvulnerableTime", 0);
  3542. players[i] DoDamage( players[i].health + 1000, players[i].origin, undefined, undefined, "riflebullet" );
  3543. setsaveddvar("player_deathInvulnerableTime", level.startInvulnerableTime);
  3544. }
  3545. }
  3546. }
  3547. }
  3548. }
  3549. }
  3550.  
  3551. wait 0.2;
  3552. }
  3553. }
  3554.  
  3555. check_to_kill_near_origin(player1, player2)
  3556. {
  3557. if (!isdefined(player1) || !isdefined(player2))
  3558. {
  3559. return false;
  3560. }
  3561.  
  3562. if (distance(player1.origin, player2.origin) > 12)
  3563. {
  3564. return false;
  3565. }
  3566.  
  3567. if ( player1 maps\_laststand::player_is_in_laststand() || player2 maps\_laststand::player_is_in_laststand() )
  3568. {
  3569. return false;
  3570. }
  3571.  
  3572. if (!isalive(player1) || !isalive(player2))
  3573. {
  3574. return false;
  3575. }
  3576.  
  3577. return true;
  3578. }
  3579.  
  3580.  
  3581. //
  3582. crawler_round_tracker()
  3583. {
  3584. level.crawler_round_count = 1;
  3585.  
  3586. level.next_crawler_round = 4;
  3587.  
  3588. sav_func = level.round_spawn_func;
  3589. while ( 1 )
  3590. {
  3591. level waittill ( "between_round_over" );
  3592.  
  3593. /#
  3594. if( GetDVarInt( "force_crawlers" ) > 0 )
  3595. {
  3596. next_crawler_round = level.round_number;
  3597. }
  3598. #/
  3599.  
  3600. if ( level.round_number == level.next_crawler_round )
  3601. {
  3602. sav_func = level.round_spawn_func;
  3603. crawler_round_start();
  3604. level.round_spawn_func = ::round_spawning;
  3605.  
  3606. if ( IsDefined( level.next_dog_round ) )
  3607. {
  3608. level.next_crawler_round = level.next_dog_round + randomintrange( 2, 3 );
  3609. }
  3610. else
  3611. {
  3612. level.next_crawler_round = randomintrange( 4, 6 );
  3613. }
  3614. /#
  3615. get_players()[0] iprintln( "Next crawler round: " + level.next_crawler_round );
  3616. #/
  3617. }
  3618. else if ( flag( "crawler_round" ) )
  3619. {
  3620. crawler_round_stop();
  3621.  
  3622. // Don't trample over the round_spawn_func setting
  3623. if ( IsDefined( level.next_dog_round ) &&
  3624. level.next_dog_round == level.round_number )
  3625. {
  3626. level.round_spawn_func = sav_func;
  3627. }
  3628.  
  3629. level.crawler_round_count += 1;
  3630. }
  3631. }
  3632. }
  3633.  
  3634.  
  3635. crawler_round_start()
  3636. {
  3637. flag_set( "crawler_round" );
  3638. // play_sound_2D( "dark_sting" );
  3639. if(!IsDefined (level.crawlerround_nomusic))
  3640. {
  3641. level.crawlerround_nomusic = 0;
  3642. }
  3643. level.crawlerround_nomusic = 1;
  3644. level notify( "crawler_round_starting" );
  3645. clientnotify( "crawler_start" );
  3646. }
  3647.  
  3648.  
  3649. crawler_round_stop()
  3650. {
  3651. flag_clear( "crawler_round" );
  3652.  
  3653. if(!IsDefined (level.crawlerround_nomusic))
  3654. {
  3655. level.crawlerround_nomusic = 0;
  3656. }
  3657. level.crawlerround_nomusic = 0;
  3658. level notify( "crawler_round_ending" );
  3659. clientnotify( "crawler_stop" );
  3660. }
Advertisement
Add Comment
Please, Sign In to add comment