Advertisement
Guest User

Untitled

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