Advertisement
Guest User

Untitled

a guest
Jan 20th, 2016
870
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 180.07 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()
  11. {
  12. level.player_too_many_weapons_monitor = true;
  13. level.player_too_many_weapons_monitor_func = ::player_too_many_weapons_monitor;
  14. level._dontInitNotifyMessage = 1;
  15. level._effect[ "fx_counter_1" ] = LoadFX( "ammo_counter/fx_counter_1" );
  16. level._effect[ "fx_counter_2" ] = LoadFX( "ammo_counter/fx_counter_2" );
  17. level._effect[ "fx_counter_3" ] = LoadFX( "ammo_counter/fx_counter_3" );
  18. level._effect[ "fx_counter_4" ] = LoadFX( "ammo_counter/fx_counter_4" );
  19. level._effect[ "fx_counter_5" ] = LoadFX( "ammo_counter/fx_counter_5" );
  20. level._effect[ "fx_counter_6" ] = LoadFX( "ammo_counter/fx_counter_6" );
  21. level._effect[ "fx_counter_7" ] = LoadFX( "ammo_counter/fx_counter_7" );
  22. level._effect[ "fx_counter_8" ] = LoadFX( "ammo_counter/fx_counter_8" );
  23. level._effect[ "fx_counter_9" ] = LoadFX( "ammo_counter/fx_counter_9" );
  24. level._effect[ "fx_counter_0" ] = LoadFX( "ammo_counter/fx_counter_0" );
  25. init_additionalprimaryweapon_machine_locations();
  26.  
  27. // put things you'd like to be able to turn off in here above this line
  28. level thread maps\_zombiemode_ffotd::main_start();
  29. precacheitem("rnmaammo_zm");
  30. level.zombiemode = true;
  31. level.reviveFeature = false;
  32. level.contextualMeleeFeature = false;
  33. level.swimmingFeature = false;
  34. level.calc_closest_player_using_paths = true;
  35. level.zombie_melee_in_water = true;
  36. level.put_timed_out_zombies_back_in_queue = true;
  37. level.use_alternate_poi_positioning = true;
  38.  
  39. //for tracking stats
  40. level.zombies_timeout_spawn = 0;
  41. level.zombies_timeout_playspace = 0;
  42. level.zombies_timeout_undamaged = 0;
  43. level.zombie_player_killed_count = 0;
  44. level.zombie_trap_killed_count = 0;
  45. level.zombie_pathing_failed = 0;
  46. level.zombie_breadcrumb_failed = 0;
  47.  
  48. level.zombie_visionset = "zombie_neutral";
  49.  
  50. if(GetDvar("anim_intro") == "1")
  51. {
  52. level.zombie_anim_intro = 1;
  53. }
  54. else
  55. {
  56. level.zombie_anim_intro = 0;
  57. }
  58.  
  59. precache_shaders();
  60. precache_models();
  61.  
  62. PrecacheItem( "frag_grenade_zm" );
  63. PrecacheItem( "claymore_zm" );
  64.  
  65. //override difficulty
  66. level.skill_override = 1;
  67. maps\_gameskill::setSkill(undefined,level.skill_override);
  68.  
  69. level.disable_player_damage_knockback = true;
  70.  
  71. level._ZOMBIE_GIB_PIECE_INDEX_ALL = 0;
  72. level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM = 1;
  73. level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM = 2;
  74. level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG = 3;
  75. level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG = 4;
  76. level._ZOMBIE_GIB_PIECE_INDEX_HEAD = 5;
  77. level._ZOMBIE_GIB_PIECE_INDEX_GUTS = 6;
  78.  
  79. init_dvars();
  80. init_mutators();
  81. init_strings();
  82. init_levelvars();
  83. init_animscripts();
  84. init_sounds();
  85. init_shellshocks();
  86. init_flags();
  87. init_client_flags();
  88.  
  89. register_offhand_weapons_for_level_defaults();
  90.  
  91. //Limit zombie to 24 max, must have for network purposes
  92. if ( !isdefined( level.zombie_ai_limit ) )
  93. {
  94. level.zombie_ai_limit = 24;
  95. SetAILimit( level.zombie_ai_limit );
  96. }
  97.  
  98. init_fx();
  99. //maps\_zombiemode_ability::init();
  100.  
  101. // load map defaults
  102. maps\_zombiemode_load::main();
  103.  
  104. // Initialize the zone manager above any scripts that make use of zone info
  105. maps\_zombiemode_zone_manager::init();
  106.  
  107. // Call the other zombiemode scripts
  108. maps\_zombiemode_audio::audio_init();
  109. maps\_zombiemode_claymore::init();
  110. maps\_zombiemode_weapons::init();
  111. maps\_zombiemode_equipment::init();
  112. maps\_zombiemode_blockers::init();
  113. maps\_zombiemode_spawner::init();
  114. maps\_zombiemode_powerups::init();
  115. maps\_zombiemode_perks::init();
  116. maps\_zombiemode_user::init();
  117. maps\_zombiemode_weap_cymbal_monkey::init();
  118. maps\_zombiemode_weap_freezegun::init();
  119. maps\_zombiemode_weap_tesla::init();
  120. maps\_zombiemode_weap_thundergun::init();
  121. maps\_zombiemode_weap_crossbow::init();
  122. //Z2 TEMP DISABLE DURING INTEGRATION
  123. maps\_zombiemode_bowie::bowie_init();
  124. // maps\_zombiemode_betty::init();
  125. // maps\_zombiemode_timer::init();
  126. // maps\_zombiemode_auto_turret::init();
  127. //maps\_zombiemode_protips::pro_tips_initialize();
  128. maps\_zombiemode_traps::init();
  129. maps\_zombiemode_weapon_box::init();
  130. /#
  131. maps\_zombiemode_devgui::init();
  132. #/
  133.  
  134. init_function_overrides();
  135.  
  136. // ww: init the pistols in the game so last stand has the importance order
  137. level thread last_stand_pistol_rank_init();
  138.  
  139. //thread maps\_zombiemode_rank::init();
  140.  
  141. // These MUST be threaded because they contain waits
  142. //level thread maps\_zombiemode_deathcard::init();
  143. //level thread maps\_zombiemode_money::init();
  144. level thread [[level.Player_Spawn_func]]();
  145. level thread onPlayerConnect();
  146. level thread post_all_players_connected();
  147.  
  148. init_utility();
  149. maps\_utility::registerClientSys("zombify"); // register a client system...
  150. init_anims(); // zombie ai and anim inits
  151.  
  152. if( isDefined( level.custom_ai_type ) )
  153. {
  154. for( i = 0; i < level.custom_ai_type.size; i++ )
  155. {
  156. [[ level.custom_ai_type[i] ]]();
  157. }
  158. }
  159.  
  160. if( level.mutators[ "mutator_friendlyFire" ] )
  161. {
  162. SetDvar( "friendlyfire_enabled", "1" );
  163. }
  164.  
  165. initZombieLeaderboardData();
  166. initializeStatTracking();
  167.  
  168. if ( GetPlayers().size <= 1 )
  169. {
  170. incrementCounter( "global_solo_games", 1 );
  171. }
  172. else if( level.systemLink )
  173. {
  174. incrementCounter( "global_systemlink_games", 1 );
  175. }
  176. else if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size )
  177. {
  178. incrementCounter( "global_splitscreen_games", 1 );
  179. }
  180. else // coop game
  181. {
  182. incrementCounter( "global_coop_games", 1 );
  183. }
  184.  
  185. // Fog in splitscreen
  186. if( IsSplitScreen() )
  187. {
  188. set_splitscreen_fog( 350, 2986.33, 10000, -480, 0.805, 0.715, 0.61, 0.0, 10000 );
  189. }
  190.  
  191. /#
  192. init_screen_stats();
  193. level thread update_screen_stats();
  194. #/
  195.  
  196. level thread maps\_zombiemode_ffotd::main_end();
  197. }
  198.  
  199. post_all_players_connected()
  200. {
  201. flag_wait( "all_players_connected" );
  202. /#
  203. execdevgui( "devgui_zombie" );
  204. #/
  205. println( "sessions: mapname=", level.script, " gametype zom isserver 1 player_count=", get_players().size );
  206.  
  207.  
  208. maps\_zombiemode_score::init();
  209. level difficulty_init();
  210.  
  211. //thread zombie_difficulty_ramp_up();
  212.  
  213. // DCS 091610: clear up blood patches when set to mature.
  214. level thread clear_mature_blood();
  215.  
  216. // Start the Zombie MODE!
  217. level thread end_game();
  218.  
  219. if(!level.zombie_anim_intro)
  220. {
  221. level thread round_start();
  222. }
  223. level thread players_playing();
  224. if ( IsDefined( level.crawlers_enabled ) && level.crawlers_enabled == 1 )
  225. {
  226. level thread crawler_round_tracker();
  227. }
  228.  
  229. //chrisp - adding spawning vo
  230. //level thread spawn_vo();
  231.  
  232. //add ammo tracker for VO
  233. level thread track_players_ammo_count();
  234.  
  235. //level thread prevent_near_origin();
  236.  
  237. DisableGrenadeSuicide();
  238.  
  239. level.startInvulnerableTime = GetDvarInt( #"player_deathInvulnerableTime" );
  240. // level.global_damage_func = maps\_zombiemode_spawner::zombie_damage;
  241. // level.global_damage_func_ads = maps\_zombiemode_spawner::zombie_damage_ads;
  242.  
  243. // TESTING
  244. // wait( 3 );
  245. // level thread intermission();
  246. // thread testing_spawner_bug();
  247.  
  248. if(!IsDefined(level.music_override) )
  249. {
  250. level.music_override = false;
  251. }
  252. }
  253.  
  254. zombiemode_melee_miss()
  255. {
  256. if( isDefined( self.enemy.curr_pay_turret ) )
  257. {
  258. self.enemy doDamage( GetDvarInt( #"ai_meleeDamage" ), self.origin, self, undefined, "melee", "none" );
  259. }
  260. }
  261.  
  262. init_additionalprimaryweapon_machine_locations()
  263. {
  264. switch ( Tolower( GetDvar( #"mapname" ) ) )
  265. {
  266. case "zombie_theater":
  267. level.zombie_additionalprimaryweapon_machine_origin = (1172.4, -359.7, 320);
  268. level.zombie_additionalprimaryweapon_machine_angles = (0, 90, 0);
  269. level.zombie_additionalprimaryweapon_machine_clip_origin = (1160, -360, 448);
  270. level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0);
  271. break;
  272. case "zombie_pentagon":
  273. level.zombie_additionalprimaryweapon_machine_origin = (-1081.4, 1496.9, -512);
  274. level.zombie_additionalprimaryweapon_machine_angles = (0, 162.2, 0);
  275. level.zombie_additionalprimaryweapon_machine_clip_origin = (-1084, 1489, -448);
  276. level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 341.4, 0);
  277. break;
  278. case "zombie_cosmodrome":
  279. level.zombie_additionalprimaryweapon_machine_origin = (420.8, 1359.1, 55);
  280. level.zombie_additionalprimaryweapon_machine_angles = (0, 270, 0);
  281. level.zombie_additionalprimaryweapon_machine_clip_origin = (436, 1359, 177);
  282. level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0);
  283.  
  284. level.zombie_additionalprimaryweapon_machine_monkey_angles = (0, 0, 0);
  285. level.zombie_additionalprimaryweapon_machine_monkey_origins = [];
  286. level.zombie_additionalprimaryweapon_machine_monkey_origins[0] = (398.8, 1398.6, 60);
  287. level.zombie_additionalprimaryweapon_machine_monkey_origins[1] = (380.8, 1358.6, 60);
  288. level.zombie_additionalprimaryweapon_machine_monkey_origins[2] = (398.8, 1318.6, 60);
  289. break;
  290. case "zombie_coast":
  291. level.zombie_additionalprimaryweapon_machine_origin = (2424.4, -2884.3, 314);
  292. level.zombie_additionalprimaryweapon_machine_angles = (0, 231.6, 0);
  293. level.zombie_additionalprimaryweapon_machine_clip_origin = (2435, -2893, 439);
  294. level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 322.2, 0);
  295. break;
  296. case "zombie_temple":
  297. level.zombie_additionalprimaryweapon_machine_origin = (-1352.9, -1437.2, -485);
  298. level.zombie_additionalprimaryweapon_machine_angles = (0, 297.8, 0);
  299. level.zombie_additionalprimaryweapon_machine_clip_origin = (-1342, -1431, -361);
  300. level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 28.8, 0);
  301. break;
  302. case "zombie_moon":
  303. level.zombie_additionalprimaryweapon_machine_origin = (1480.8, 3450, -65);
  304. level.zombie_additionalprimaryweapon_machine_angles = (0, 180, 0);
  305. break;
  306. case "zombie_cod5_prototype":
  307. level.zombie_additionalprimaryweapon_machine_origin = (-160, -528, 1);
  308. level.zombie_additionalprimaryweapon_machine_angles = (0, 0, 0);
  309. level.zombie_additionalprimaryweapon_machine_clip_origin = (-162, -517, 17);
  310. level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0);
  311. break;
  312. case "zombie_cod5_asylum":
  313. level.zombie_additionalprimaryweapon_machine_origin = (-91, 540, 64);
  314. level.zombie_additionalprimaryweapon_machine_angles = (0, 90, 0);
  315. level.zombie_additionalprimaryweapon_machine_clip_origin = (-103, 540, 92);
  316. level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0);
  317. break;
  318. case "zombie_cod5_sumpf":
  319. level.zombie_additionalprimaryweapon_machine_origin = (9565, 327, -529);
  320. level.zombie_additionalprimaryweapon_machine_angles = (0, 90, 0);
  321. level.zombie_additionalprimaryweapon_machine_clip_origin = (9555, 327, -402);
  322. level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0);
  323. break;
  324. case "zombie_cod5_factory":
  325. level.zombie_additionalprimaryweapon_machine_origin = (-1089, -1366, 67);
  326. level.zombie_additionalprimaryweapon_machine_angles = (0, 90, 0);
  327. level.zombie_additionalprimaryweapon_machine_clip_origin = (-1100, -1365, 70);
  328. level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0);
  329. break;
  330. }
  331. }
  332.  
  333. /*------------------------------------
  334. chrisp - adding vo to track players ammo
  335. ------------------------------------*/
  336. track_players_ammo_count()
  337. {
  338. self endon("disconnect");
  339. self endon("death");
  340.  
  341. wait(5);
  342.  
  343. while(1)
  344. {
  345. players = get_players();
  346. for(i=0;i<players.size;i++)
  347. {
  348. if(!IsDefined (players[i].player_ammo_low))
  349. {
  350. players[i].player_ammo_low = 0;
  351. }
  352. if(!IsDefined(players[i].player_ammo_out))
  353. {
  354. players[i].player_ammo_out = 0;
  355. }
  356.  
  357. weap = players[i] getcurrentweapon();
  358. //iprintln("current weapon: " + weap);
  359. //iprintlnbold(weap);
  360. //Excludes all Perk based 'weapons' so that you don't get low ammo spam.
  361. if( !isDefined(weap) ||
  362. weap == "none" ||
  363. isSubStr( weap, "zombie_perk_bottle" ) ||
  364. is_placeable_mine( weap ) ||
  365. is_equipment( weap ) ||
  366. weap == "syrette_sp" ||
  367. weap == "zombie_knuckle_crack" ||
  368. weap == "zombie_bowie_flourish" ||
  369. weap == "zombie_sickle_flourish" ||
  370. issubstr( weap, "knife_ballistic_" ) ||
  371. ( GetSubStr( weap, 0, 3) == "gl_" ) ||
  372. weap == "humangun_zm" ||
  373. weap == "humangun_upgraded_zm" ||
  374. weap == "equip_gasmask_zm" ||
  375. weap == "lower_equip_gasmask_zm" )
  376. {
  377. continue;
  378. }
  379. //iprintln("checking ammo for " + weap);
  380. if ( players[i] GetAmmoCount( weap ) > 5)
  381. {
  382. continue;
  383. }
  384. if ( players[i] maps\_laststand::player_is_in_laststand() )
  385. {
  386. continue;
  387. }
  388. else if (players[i] GetAmmoCount( weap ) < 5 && players[i] GetAmmoCount( weap ) > 0)
  389. {
  390. if (players[i].player_ammo_low != 1 )
  391. {
  392. players[i].player_ammo_low = 1;
  393. players[i] maps\_zombiemode_audio::create_and_play_dialog( "general", "ammo_low" );
  394. players[i] thread ammo_dialog_timer();
  395. }
  396.  
  397. }
  398. else if (players[i] GetAmmoCount( weap ) == 0)
  399. {
  400. if(!isDefined(weap) || weap == "none")
  401. {
  402. continue;
  403. }
  404. wait(2);
  405.  
  406. if( !isdefined( players[i] ) )
  407. {
  408. return;
  409. }
  410.  
  411. if( players[i] GetAmmoCount( weap ) != 0 )
  412. {
  413. continue;
  414. }
  415.  
  416. if( players[i].player_ammo_out != 1 )
  417. {
  418. players[i].player_ammo_out = 1;
  419. players[i] maps\_zombiemode_audio::create_and_play_dialog( "general", "ammo_out" );
  420. players[i] thread ammoout_dialog_timer();
  421. }
  422. }
  423. else
  424. {
  425. continue;
  426. }
  427. }
  428. wait(.5);
  429. }
  430. }
  431. ammo_dialog_timer()
  432. {
  433. self endon("disconnect");
  434. self endon("death");
  435.  
  436. wait(20);
  437. self.player_ammo_low = 0;
  438. }
  439. ammoout_dialog_timer()
  440. {
  441. self endon("disconnect");
  442. self endon("death");
  443.  
  444. wait(20);
  445. self.player_ammo_out = 0;
  446. }
  447.  
  448. /*------------------------------------
  449. audio plays when more than 1 player connects
  450. ------------------------------------*/
  451. spawn_vo()
  452. {
  453. //not sure if we need this
  454. wait(1);
  455.  
  456. players = getplayers();
  457.  
  458. //just pick a random player for now and play some vo
  459. if(players.size > 1)
  460. {
  461. player = random(players);
  462. index = maps\_zombiemode_weapons::get_player_index(player);
  463. player thread spawn_vo_player(index,players.size);
  464. }
  465.  
  466. }
  467.  
  468. spawn_vo_player(index,num)
  469. {
  470. sound = "plr_" + index + "_vox_" + num +"play";
  471. self playsound(sound, "sound_done");
  472. self waittill("sound_done");
  473. }
  474.  
  475. testing_spawner_bug()
  476. {
  477. wait( 0.1 );
  478. level.round_number = 7;
  479.  
  480. spawners = [];
  481. spawners[0] = GetEnt( "testy", "targetname" );
  482. while( 1 )
  483. {
  484. wait( 1 );
  485. level.enemy_spawns = spawners;
  486. }
  487. }
  488.  
  489. precache_shaders()
  490. {
  491. PrecacheShader( "hud_chalk_1" );
  492. PrecacheShader( "hud_chalk_2" );
  493. PrecacheShader( "hud_chalk_3" );
  494. PrecacheShader( "hud_chalk_4" );
  495. PrecacheShader( "hud_chalk_5" );
  496.  
  497. PrecacheShader( "zom_icon_community_pot" );
  498. PrecacheShader( "zom_icon_community_pot_strip" );
  499.  
  500. precacheshader("zom_icon_player_life");
  501. }
  502.  
  503. precache_models()
  504. {
  505. precachemodel( "char_ger_zombieeye" );
  506. precachemodel( "p_zom_win_bars_01_vert04_bend_180" );
  507. precachemodel( "p_zom_win_bars_01_vert01_bend_180" );
  508. precachemodel( "p_zom_win_bars_01_vert04_bend" );
  509. precachemodel( "p_zom_win_bars_01_vert01_bend" );
  510. PreCacheModel( "p_zom_win_cell_bars_01_vert04_bent" );
  511. precachemodel( "p_zom_win_cell_bars_01_vert01_bent" );
  512. PrecacheModel( "tag_origin" );
  513.  
  514. // Counter models
  515. PrecacheModel( "p_zom_counter_0" );
  516. PrecacheModel( "p_zom_counter_1" );
  517. PrecacheModel( "p_zom_counter_2" );
  518. PrecacheModel( "p_zom_counter_3" );
  519. PrecacheModel( "p_zom_counter_4" );
  520. PrecacheModel( "p_zom_counter_5" );
  521. PrecacheModel( "p_zom_counter_6" );
  522. PrecacheModel( "p_zom_counter_7" );
  523. PrecacheModel( "p_zom_counter_8" );
  524. PrecacheModel( "p_zom_counter_9" );
  525.  
  526. // Player Tombstone
  527. precachemodel("zombie_revive");
  528.  
  529. PrecacheModel( "zombie_z_money_icon" );
  530. }
  531.  
  532. init_shellshocks()
  533. {
  534. level.player_killed_shellshock = "zombie_death";
  535. PrecacheShellshock( level.player_killed_shellshock );
  536. }
  537.  
  538. init_strings()
  539. {
  540. PrecacheString( &"ZOMBIE_WEAPONCOSTAMMO" );
  541. PrecacheString( &"ZOMBIE_ROUND" );
  542. PrecacheString( &"SCRIPT_PLUS" );
  543. PrecacheString( &"ZOMBIE_GAME_OVER" );
  544. PrecacheString( &"ZOMBIE_SURVIVED_ROUND" );
  545. PrecacheString( &"ZOMBIE_SURVIVED_ROUNDS" );
  546. PrecacheString( &"ZOMBIE_SURVIVED_NOMANS" );
  547. PrecacheString( &"ZOMBIE_EXTRA_LIFE" );
  548.  
  549. add_zombie_hint( "undefined", &"ZOMBIE_UNDEFINED" );
  550.  
  551. // Random Treasure Chest
  552. add_zombie_hint( "default_treasure_chest_950", &"ZOMBIE_RANDOM_WEAPON_950" );
  553.  
  554. // Barrier Pieces
  555. add_zombie_hint( "default_buy_barrier_piece_10", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_10" );
  556. add_zombie_hint( "default_buy_barrier_piece_20", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_20" );
  557. add_zombie_hint( "default_buy_barrier_piece_50", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_50" );
  558. add_zombie_hint( "default_buy_barrier_piece_100", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_100" );
  559.  
  560. // REWARD Barrier Pieces
  561. add_zombie_hint( "default_reward_barrier_piece", &"ZOMBIE_BUTTON_REWARD_BARRIER" );
  562. add_zombie_hint( "default_reward_barrier_piece_10", &"ZOMBIE_BUTTON_REWARD_BARRIER_10" );
  563. add_zombie_hint( "default_reward_barrier_piece_20", &"ZOMBIE_BUTTON_REWARD_BARRIER_20" );
  564. add_zombie_hint( "default_reward_barrier_piece_30", &"ZOMBIE_BUTTON_REWARD_BARRIER_30" );
  565. add_zombie_hint( "default_reward_barrier_piece_40", &"ZOMBIE_BUTTON_REWARD_BARRIER_40" );
  566. add_zombie_hint( "default_reward_barrier_piece_50", &"ZOMBIE_BUTTON_REWARD_BARRIER_50" );
  567.  
  568. // Debris
  569. add_zombie_hint( "default_buy_debris_100", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_100" );
  570. add_zombie_hint( "default_buy_debris_200", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_200" );
  571. add_zombie_hint( "default_buy_debris_250", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_250" );
  572. add_zombie_hint( "default_buy_debris_500", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_500" );
  573. add_zombie_hint( "default_buy_debris_750", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_750" );
  574. add_zombie_hint( "default_buy_debris_1000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1000" );
  575. add_zombie_hint( "default_buy_debris_1250", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1250" );
  576. add_zombie_hint( "default_buy_debris_1500", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1500" );
  577. add_zombie_hint( "default_buy_debris_1750", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1750" );
  578. add_zombie_hint( "default_buy_debris_2000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_2000" );
  579.  
  580. // Doors
  581. add_zombie_hint( "default_buy_door_100", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_100" );
  582. add_zombie_hint( "default_buy_door_200", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_200" );
  583. add_zombie_hint( "default_buy_door_250", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_250" );
  584. add_zombie_hint( "default_buy_door_500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_500" );
  585. add_zombie_hint( "default_buy_door_750", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_750" );
  586. add_zombie_hint( "default_buy_door_1000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1000" );
  587. add_zombie_hint( "default_buy_door_1250", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1250" );
  588. add_zombie_hint( "default_buy_door_1500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1500" );
  589. add_zombie_hint( "default_buy_door_1750", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1750" );
  590. add_zombie_hint( "default_buy_door_2000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_2000" );
  591.  
  592. // Areas
  593. add_zombie_hint( "default_buy_area_100", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_100" );
  594. add_zombie_hint( "default_buy_area_200", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_200" );
  595. add_zombie_hint( "default_buy_area_250", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_250" );
  596. add_zombie_hint( "default_buy_area_500", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_500" );
  597. add_zombie_hint( "default_buy_area_750", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_750" );
  598. add_zombie_hint( "default_buy_area_1000", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1000" );
  599. add_zombie_hint( "default_buy_area_1250", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1250" );
  600. add_zombie_hint( "default_buy_area_1500", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1500" );
  601. add_zombie_hint( "default_buy_area_1750", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1750" );
  602. add_zombie_hint( "default_buy_area_2000", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_2000" );
  603.  
  604. // POWER UPS
  605. add_zombie_hint( "powerup_fire_sale_cost", &"ZOMBIE_FIRE_SALE_COST" );
  606.  
  607. }
  608.  
  609. init_sounds()
  610. {
  611. add_sound( "end_of_round", "mus_zmb_round_over" );
  612. add_sound( "end_of_game", "mus_zmb_game_over" ); //Had to remove this and add a music state switch so that we can add other musical elements.
  613. add_sound( "chalk_one_up", "mus_zmb_chalk" );
  614. add_sound( "purchase", "zmb_cha_ching" );
  615. add_sound( "no_purchase", "zmb_no_cha_ching" );
  616.  
  617. // Zombification
  618. // TODO need to vary these up
  619. add_sound( "playerzombie_usebutton_sound", "zmb_zombie_vocals_attack" );
  620. add_sound( "playerzombie_attackbutton_sound", "zmb_zombie_vocals_attack" );
  621. add_sound( "playerzombie_adsbutton_sound", "zmb_zombie_vocals_attack" );
  622.  
  623. // Head gib
  624. add_sound( "zombie_head_gib", "zmb_zombie_head_gib" );
  625.  
  626. // Blockers
  627. add_sound( "rebuild_barrier_piece", "zmb_repair_boards" );
  628. add_sound( "rebuild_barrier_metal_piece", "zmb_metal_repair" );
  629. add_sound( "rebuild_barrier_hover", "zmb_boards_float" );
  630. add_sound( "debris_hover_loop", "zmb_couch_loop" );
  631. add_sound( "break_barrier_piece", "zmb_break_boards" );
  632. add_sound( "grab_metal_bar", "zmb_bar_pull" );
  633. add_sound( "break_metal_bar", "zmb_bar_break" );
  634. add_sound( "drop_metal_bar", "zmb_bar_drop" );
  635. add_sound("blocker_end_move", "zmb_board_slam");
  636. add_sound( "barrier_rebuild_slam", "zmb_board_slam" );
  637. add_sound( "bar_rebuild_slam", "zmb_bar_repair" );
  638. add_sound( "zmb_rock_fix", "zmb_break_rock_barrier_fix" );
  639. add_sound( "zmb_vent_fix", "evt_vent_slat_repair" );
  640.  
  641. // Doors
  642. add_sound( "door_slide_open", "zmb_door_slide_open" );
  643. add_sound( "door_rotate_open", "zmb_door_slide_open" );
  644.  
  645. // Debris
  646. add_sound( "debris_move", "zmb_weap_wall" );
  647.  
  648. // Random Weapon Chest
  649. add_sound( "open_chest", "zmb_lid_open" );
  650. add_sound( "music_chest", "zmb_music_box" );
  651. add_sound( "close_chest", "zmb_lid_close" );
  652.  
  653. // Weapons on walls
  654. add_sound( "weapon_show", "zmb_weap_wall" );
  655.  
  656. }
  657.  
  658. init_levelvars()
  659. {
  660. // Variables
  661. // used to a check in last stand for players to become zombies
  662. level.is_zombie_level = true;
  663. level.laststandpistol = "m1911_zm"; // so we dont get the uber colt when we're knocked out
  664. level.first_round = true;
  665. level.round_number = 1;
  666. level.round_start_time = 0;
  667. level.pro_tips_start_time = 0;
  668. level.intermission = false;
  669. level.dog_intermission = false;
  670. level.zombie_total = 0;
  671. level.total_zombies_killed = 0;
  672. level.no_laststandmissionfail = true;
  673. level.hudelem_count = 0;
  674. level.zombie_move_speed = 1;
  675. level.enemy_spawns = []; // List of normal zombie spawners
  676. level.zombie_rise_spawners = []; // List of zombie riser locations
  677. // level.crawlers_enabled = 1;
  678.  
  679. // Used for kill counters
  680. level.counter_model[0] = "p_zom_counter_0";
  681. level.counter_model[1] = "p_zom_counter_1";
  682. level.counter_model[2] = "p_zom_counter_2";
  683. level.counter_model[3] = "p_zom_counter_3";
  684. level.counter_model[4] = "p_zom_counter_4";
  685. level.counter_model[5] = "p_zom_counter_5";
  686. level.counter_model[6] = "p_zom_counter_6";
  687. level.counter_model[7] = "p_zom_counter_7";
  688. level.counter_model[8] = "p_zom_counter_8";
  689. level.counter_model[9] = "p_zom_counter_9";
  690.  
  691. level.zombie_vars = [];
  692.  
  693. difficulty = 1;
  694. column = int(difficulty) + 1;
  695.  
  696. //#######################################################################
  697. // NOTE: These values are in mp/zombiemode.csv and will override
  698. // whatever you put in as a value below. However, if they don't exist
  699. // in the file, then the values below will be used.
  700. //#######################################################################
  701. // set_zombie_var( identifier, value, float, column );
  702.  
  703. // AI
  704. set_zombie_var( "zombie_health_increase", 100, false, column ); // cumulatively add this to the zombies' starting health each round (up to round 10)
  705. set_zombie_var( "zombie_health_increase_multiplier",0.1, true, column ); // after round 10 multiply the zombies' starting health by this amount
  706. set_zombie_var( "zombie_health_start", 150, false, column ); // starting health of a zombie at round 1
  707. set_zombie_var( "zombie_spawn_delay", 2.0, true, column ); // Base time to wait between spawning zombies. This is modified based on the round number.
  708. set_zombie_var( "zombie_new_runner_interval", 10, false, column ); // Interval between changing walkers who are too far away into runners
  709. set_zombie_var( "zombie_move_speed_multiplier", 8, false, column ); // Multiply by the round number to give the base speed value. 0-40 = walk, 41-70 = run, 71+ = sprint
  710.  
  711. set_zombie_var( "zombie_max_ai", 24, false, column ); // Base number of zombies per player (modified by round #)
  712. set_zombie_var( "zombie_ai_per_player", 6, false, column ); // additional zombie modifier for each player in the game
  713. set_zombie_var( "below_world_check", -1000 ); // Check height to see if a zombie has fallen through the world.
  714.  
  715. // Round
  716. set_zombie_var( "spectators_respawn", true ); // Respawn in the spectators in between rounds
  717. set_zombie_var( "zombie_use_failsafe", true ); // Will slowly kill zombies who are stuck
  718. set_zombie_var( "zombie_between_round_time", 10 ); // How long to pause after the round ends
  719. set_zombie_var( "zombie_intermission_time", 15 ); // Length of time to show the end of game stats
  720. set_zombie_var( "game_start_delay", 0, false, column ); // How much time to give people a break before starting spawning
  721.  
  722. // Life and death
  723. set_zombie_var( "penalty_no_revive", 0.10, true, column ); // Percentage of money you lose if you let a teammate die
  724. set_zombie_var( "penalty_died", 0.0, true, column ); // Percentage of money lost if you die
  725. set_zombie_var( "penalty_downed", 0.05, true, column ); // Percentage of money lost if you go down // ww: told to remove downed point loss
  726. set_zombie_var( "starting_lives", 1, false, column ); // How many lives a solo player starts out with
  727.  
  728. players = get_players();
  729. points = set_zombie_var( ("zombie_score_start_"+players.size+"p"), 3000, false, column );
  730. points = set_zombie_var( ("zombie_score_start_"+players.size+"p"), 3000, false, column );
  731.  
  732.  
  733. set_zombie_var( "zombie_score_kill_4player", 50 ); // Individual Points for a zombie kill in a 4 player game
  734. set_zombie_var( "zombie_score_kill_3player", 50 ); // Individual Points for a zombie kill in a 3 player game
  735. set_zombie_var( "zombie_score_kill_2player", 50 ); // Individual Points for a zombie kill in a 2 player game
  736. set_zombie_var( "zombie_score_kill_1player", 50 ); // Individual Points for a zombie kill in a 1 player game
  737.  
  738. set_zombie_var( "zombie_score_kill_4p_team", 30 ); // Team Points for a zombie kill in a 4 player game
  739. set_zombie_var( "zombie_score_kill_3p_team", 35 ); // Team Points for a zombie kill in a 3 player game
  740. set_zombie_var( "zombie_score_kill_2p_team", 45 ); // Team Points for a zombie kill in a 2 player game
  741. set_zombie_var( "zombie_score_kill_1p_team", 0 ); // Team Points for a zombie kill in a 1 player game
  742.  
  743. set_zombie_var( "zombie_score_damage_normal", 10 ); // points gained for a hit with a non-automatic weapon
  744. set_zombie_var( "zombie_score_damage_light", 10 ); // points gained for a hit with an automatic weapon
  745.  
  746. set_zombie_var( "zombie_score_bonus_melee", 80 ); // Bonus points for a melee kill
  747. set_zombie_var( "zombie_score_bonus_head", 50 ); // Bonus points for a head shot kill
  748. set_zombie_var( "zombie_score_bonus_neck", 20 ); // Bonus points for a neck shot kill
  749. set_zombie_var( "zombie_score_bonus_torso", 10 ); // Bonus points for a torso shot kill
  750. set_zombie_var( "zombie_score_bonus_burn", 10 ); // Bonus points for a burn kill
  751.  
  752. set_zombie_var( "zombie_flame_dmg_point_delay", 500 );
  753.  
  754. set_zombie_var( "zombify_player", false ); // Default to not zombify the player till further support
  755.  
  756. if ( IsSplitScreen() )
  757. {
  758. set_zombie_var( "zombie_timer_offset", 280 ); // hud offsets
  759. }
  760. }
  761.  
  762. init_dvars()
  763. {
  764. setSavedDvar( "fire_world_damage", "0" );
  765. setSavedDvar( "fire_world_damage_rate", "0" );
  766. setSavedDvar( "fire_world_damage_duration", "0" );
  767.  
  768. if( GetDvar( #"zombie_debug" ) == "" )
  769. {
  770. SetDvar( "zombie_debug", "0" );
  771. }
  772.  
  773. if( GetDvar( #"zombie_cheat" ) == "" )
  774. {
  775. SetDvar( "zombie_cheat", "0" );
  776. }
  777.  
  778. if ( level.script != "zombie_cod5_prototype" )
  779. {
  780. SetDvar( "magic_chest_movable", "1" );
  781. }
  782.  
  783. if(GetDvar( #"magic_box_explore_only") == "")
  784. {
  785. SetDvar( "magic_box_explore_only", "1" );
  786. }
  787.  
  788. SetDvar( "revive_trigger_radius", "75" );
  789. SetDvar( "player_lastStandBleedoutTime", "45" );
  790.  
  791. SetDvar( "scr_deleteexplosivesonspawn", "0" );
  792.  
  793. // HACK: To avoid IK crash in zombiemode: MikeA 9/18/2009
  794. //setDvar( "ik_enable", "0" );
  795. }
  796.  
  797.  
  798. init_mutators()
  799. {
  800. level.mutators = [];
  801.  
  802. init_mutator( "mutator_noPerks" );
  803. init_mutator( "mutator_noTraps" );
  804. init_mutator( "mutator_noMagicBox" );
  805. init_mutator( "mutator_noRevive" );
  806. init_mutator( "mutator_noPowerups" );
  807. init_mutator( "mutator_noReloads" );
  808. init_mutator( "mutator_noBoards" );
  809. init_mutator( "mutator_fogMatch" );
  810. init_mutator( "mutator_quickStart" );
  811. init_mutator( "mutator_headshotsOnly" );
  812. init_mutator( "mutator_friendlyFire" );
  813. init_mutator( "mutator_doubleMoney" );
  814. init_mutator( "mutator_susceptible" );
  815. init_mutator( "mutator_powerShot" );
  816. }
  817.  
  818. init_mutator( mutator_s )
  819. {
  820. level.mutators[ mutator_s ] = ( "1" == GetDvar( mutator_s ) );
  821. }
  822.  
  823.  
  824. init_function_overrides()
  825. {
  826. // Function pointers
  827. level.custom_introscreen = ::zombie_intro_screen;
  828. level.custom_intermission = ::player_intermission;
  829. level.reset_clientdvars = ::onPlayerConnect_clientDvars;
  830. // Sets up function pointers for animscripts to refer to
  831. level.playerlaststand_func = ::player_laststand;
  832. // level.global_kill_func = maps\_zombiemode_spawner::zombie_death;
  833. level.global_damage_func = maps\_zombiemode_spawner::zombie_damage;
  834. level.global_damage_func_ads = maps\_zombiemode_spawner::zombie_damage_ads;
  835. level.overridePlayerKilled = ::player_killed_override;
  836. level.overridePlayerDamage = ::player_damage_override; //_cheat;
  837. level.overrideActorKilled = ::actor_killed_override;
  838. level.overrideActorDamage = ::actor_damage_override;
  839. level.melee_miss_func = ::zombiemode_melee_miss;
  840. level.player_becomes_zombie = ::zombify_player;
  841. level.is_friendly_fire_on = ::is_friendly_fire_on;
  842. level.can_revive = ::can_revive;
  843. level.zombie_last_stand = ::last_stand_pistol_swap;
  844. level.zombie_last_stand_pistol_memory = ::last_stand_save_pistol_ammo;
  845. level.zombie_last_stand_ammo_return = ::last_stand_restore_pistol_ammo;
  846. level.prevent_player_damage = ::player_prevent_damage;
  847.  
  848. if( !IsDefined( level.Player_Spawn_func ) )
  849. {
  850. level.Player_Spawn_func = ::coop_player_spawn_placement;
  851. }
  852. }
  853.  
  854.  
  855. // for zombietron, see maps\_zombietron_main::initZombieLeaderboardData()
  856. //
  857. initZombieLeaderboardData()
  858. {
  859. // Initializing Leaderboard Stat Variables -- string values match stats.ddl
  860. level.zombieLeaderboardStatVariable["zombie_theater"]["highestwave"] = "zombie_theater_highestwave";
  861. level.zombieLeaderboardStatVariable["zombie_theater"]["timeinwave"] = "zombie_theater_timeinwave";
  862. level.zombieLeaderboardStatVariable["zombie_theater"]["totalpoints"] = "zombie_theater_totalpoints";
  863.  
  864. level.zombieLeaderboardStatVariable["zombie_pentagon"]["highestwave"] = "zombie_pentagon_highestwave";
  865. level.zombieLeaderboardStatVariable["zombie_pentagon"]["timeinwave"] = "zombie_pentagon_timeinwave";
  866. level.zombieLeaderboardStatVariable["zombie_pentagon"]["totalpoints"] = "zombie_pentagon_totalpoints";
  867.  
  868. // DLC 1 Cod 5 Zombies Leaderboard Stats
  869.  
  870. level.zombieLeaderboardStatVariable["zombie_cod5_asylum"]["highestwave"] = "zombie_asylum_highestwave";
  871. level.zombieLeaderboardStatVariable["zombie_cod5_asylum"]["timeinwave"] = "zombie_asylum_timeinwave";
  872. level.zombieLeaderboardStatVariable["zombie_cod5_asylum"]["totalpoints"] = "zombie_asylum_totalpoints";
  873.  
  874. level.zombieLeaderboardStatVariable["zombie_cod5_factory"]["highestwave"] = "zombie_factory_highestwave";
  875. level.zombieLeaderboardStatVariable["zombie_cod5_factory"]["timeinwave"] = "zombie_factory_timeinwave";
  876. level.zombieLeaderboardStatVariable["zombie_cod5_factory"]["totalpoints"] = "zombie_factory_totalpoints";
  877.  
  878. level.zombieLeaderboardStatVariable["zombie_cod5_prototype"]["highestwave"] = "zombie_prototype_highestwave";
  879. level.zombieLeaderboardStatVariable["zombie_cod5_prototype"]["timeinwave"] = "zombie_prototype_timeinwave";
  880. level.zombieLeaderboardStatVariable["zombie_cod5_prototype"]["totalpoints"] = "zombie_prototype_totalpoints";
  881.  
  882. level.zombieLeaderboardStatVariable["zombie_cod5_sumpf"]["highestwave"] = "zombie_sumpf_highestwave";
  883. level.zombieLeaderboardStatVariable["zombie_cod5_sumpf"]["timeinwave"] = "zombie_sumpf_timeinwave";
  884. level.zombieLeaderboardStatVariable["zombie_cod5_sumpf"]["totalpoints"] = "zombie_sumpf_totalpoints";
  885.  
  886. // DLC 2 Zombies Leaderboard Stats
  887.  
  888. level.zombieLeaderboardStatVariable["zombie_cosmodrome"]["highestwave"] = "zombie_cosmodrome_highestwave";
  889. level.zombieLeaderboardStatVariable["zombie_cosmodrome"]["timeinwave"] = "zombie_cosmodrome_timeinwave";
  890. level.zombieLeaderboardStatVariable["zombie_cosmodrome"]["totalpoints"] = "zombie_cosmodrome_totalpoints";
  891.  
  892. // DLC 3 Zombies Leaderboard Stats
  893.  
  894. level.zombieLeaderboardStatVariable["zombie_coast"]["highestwave"] = "zombie_coast_highestwave";
  895. level.zombieLeaderboardStatVariable["zombie_coast"]["timeinwave"] = "zombie_coast_timeinwave";
  896. level.zombieLeaderboardStatVariable["zombie_coast"]["totalpoints"] = "zombie_coast_totalpoints";
  897.  
  898. // DLC 4 Zombies Leaderboard Stats
  899.  
  900. level.zombieLeaderboardStatVariable["zombie_temple"]["highestwave"] = "zombie_temple_highestwave";
  901. level.zombieLeaderboardStatVariable["zombie_temple"]["timeinwave"] = "zombie_temple_timeinwave";
  902. level.zombieLeaderboardStatVariable["zombie_temple"]["totalpoints"] = "zombie_temple_totalpoints";
  903.  
  904. // DLC 5 Zombies Leaderboard Stats
  905.  
  906. level.zombieLeaderboardStatVariable["zombie_moon"]["highestwave"] = "zombie_moon_highestwave";
  907. level.zombieLeaderboardStatVariable["zombie_moon"]["timeinwave"] = "zombie_moon_timeinwave";
  908. level.zombieLeaderboardStatVariable["zombie_moon"]["totalpoints"] = "zombie_moon_totalpoints";
  909. level.zombieLeaderboardStatVariable["zombie_moon"]["nomanslandtime"] = "zombie_moon_nomansland";
  910.  
  911.  
  912. // Initializing Leaderboard Number. Matches values in live_leaderboard.h.
  913. level.zombieLeaderboardNumber["zombie_theater"]["waves"] = 0;
  914. level.zombieLeaderboardNumber["zombie_theater"]["points"] = 1;
  915.  
  916. // level.zombieLeaderboardNumber["zombietron"]["waves"] = 3; // defined in _zombietron_main.gsc
  917. // level.zombieLeaderboardNumber["zombietron"]["points"] = 4; // defined in _zombietron_main.gsc
  918.  
  919. level.zombieLeaderboardNumber["zombie_pentagon"]["waves"] = 6;
  920. level.zombieLeaderboardNumber["zombie_pentagon"]["points"] = 7;
  921.  
  922. // DLC 1 Cod 5 Zombie leaderboards
  923.  
  924. // Asylum
  925. level.zombieLeaderboardNumber["zombie_cod5_asylum"]["waves"] = 9;
  926. level.zombieLeaderboardNumber["zombie_cod5_asylum"]["points"] = 10;
  927.  
  928. // Factory
  929. level.zombieLeaderboardNumber["zombie_cod5_factory"]["waves"] = 12;
  930. level.zombieLeaderboardNumber["zombie_cod5_factory"]["points"] = 13;
  931.  
  932. // Prototype
  933. level.zombieLeaderboardNumber["zombie_cod5_prototype"]["waves"] = 15;
  934. level.zombieLeaderboardNumber["zombie_cod5_prototype"]["points"] = 16;
  935.  
  936. // Sumpf
  937. level.zombieLeaderboardNumber["zombie_cod5_sumpf"]["waves"] = 18;
  938. level.zombieLeaderboardNumber["zombie_cod5_sumpf"]["points"] = 19;
  939.  
  940. // DLC 2 Zombie leaderboards
  941.  
  942. // Cosmodrome
  943. level.zombieLeaderboardNumber["zombie_cosmodrome"]["waves"] = 21;
  944. level.zombieLeaderboardNumber["zombie_cosmodrome"]["points"] = 22;
  945.  
  946. // DLC 3 Zombie leaderboards
  947.  
  948. // Coast
  949. level.zombieLeaderboardNumber["zombie_coast"]["waves"] = 24;
  950. level.zombieLeaderboardNumber["zombie_coast"]["points"] = 25;
  951.  
  952. // DLC 4 Zombie leaderboards
  953.  
  954. // Temple
  955. level.zombieLeaderboardNumber["zombie_temple"]["waves"] = 27;
  956. level.zombieLeaderboardNumber["zombie_temple"]["points"] = 28;
  957.  
  958. // DLC 5 Zombie leaderboards
  959.  
  960. // Moon
  961. level.zombieLeaderboardNumber["zombie_moon"]["waves"] = 30;
  962. level.zombieLeaderboardNumber["zombie_moon"]["points"] = 31;
  963. level.zombieLeaderboardNumber["zombie_moon"]["kills"] = 32;
  964. }
  965.  
  966.  
  967. init_flags()
  968. {
  969. flag_init( "spawn_point_override" );
  970. flag_init( "power_on" );
  971. flag_init( "crawler_round" );
  972. flag_init( "spawn_zombies", true );
  973. flag_init( "dog_round" );
  974. flag_init( "begin_spawning" );
  975. flag_init( "end_round_wait" );
  976. flag_init( "wait_and_revive" );
  977. flag_init("instant_revive");
  978. }
  979.  
  980. // Client flags registered here should be for global zombie systems, and should
  981. // prefer to use high flag numbers and work downwards.
  982.  
  983. // Level specific flags should be registered in the level, and should prefer
  984. // low numbers, and work upwards.
  985.  
  986. // Ensure that this function and the function in _zombiemode.csc match.
  987.  
  988. init_client_flags()
  989. {
  990. // Client flags for script movers
  991.  
  992. level._ZOMBIE_SCRIPTMOVER_FLAG_BOX_RANDOM = 15;
  993.  
  994.  
  995. if(is_true(level.use_clientside_board_fx))
  996. {
  997. //for tearing down and repairing the boards and rock chunks
  998. level._ZOMBIE_SCRIPTMOVER_FLAG_BOARD_HORIZONTAL_FX = 14;
  999. level._ZOMBIE_SCRIPTMOVER_FLAG_BOARD_VERTICAL_FX = 13;
  1000. }
  1001. if(is_true(level.use_clientside_rock_tearin_fx))
  1002. {
  1003. level._ZOMBIE_SCRIPTMOVER_FLAG_ROCK_FX = 12;
  1004. }
  1005.  
  1006. // Client flags for the player
  1007.  
  1008. level._ZOMBIE_PLAYER_FLAG_CLOAK_WEAPON = 14;
  1009. level._ZOMBIE_PLAYER_FLAG_DIVE2NUKE_VISION = 13;
  1010. level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK = 12;
  1011.  
  1012. if(is_true(level.riser_fx_on_client))
  1013. {
  1014. level._ZOMBIE_ACTOR_ZOMBIE_RISER_FX = 8;
  1015. if(!isDefined(level._no_water_risers))
  1016. {
  1017. level._ZOMBIE_ACTOR_ZOMBIE_RISER_FX_WATER = 9;
  1018. }
  1019. if(is_true(level.risers_use_low_gravity_fx))
  1020. {
  1021. level._ZOMBIE_ACTOR_ZOMBIE_RISER_LOWG_FX = 7;
  1022. }
  1023. }
  1024.  
  1025. }
  1026.  
  1027. init_fx()
  1028. {
  1029. level._effect["wood_chunk_destory"] = LoadFX( "impacts/fx_large_woodhit" );
  1030. level._effect["fx_zombie_bar_break"] = LoadFX( "maps/zombie/fx_zombie_bar_break" );
  1031. level._effect["fx_zombie_bar_break_lite"] = LoadFX( "maps/zombie/fx_zombie_bar_break_lite" );
  1032.  
  1033. level._effect["edge_fog"] = LoadFX( "maps/zombie/fx_fog_zombie_amb" );
  1034. level._effect["chest_light"] = LoadFX( "env/light/fx_ray_sun_sm_short" );
  1035.  
  1036. level._effect["eye_glow"] = LoadFX( "misc/fx_zombie_eye_single" );
  1037.  
  1038. level._effect["headshot"] = LoadFX( "impacts/fx_flesh_hit" );
  1039. level._effect["headshot_nochunks"] = LoadFX( "misc/fx_zombie_bloodsplat" );
  1040. level._effect["bloodspurt"] = LoadFX( "misc/fx_zombie_bloodspurt" );
  1041. level._effect["tesla_head_light"] = LoadFX( "maps/zombie/fx_zombie_tesla_neck_spurt");
  1042.  
  1043. level._effect["rise_burst_water"] = LoadFX("maps/zombie/fx_zombie_body_wtr_burst");
  1044. level._effect["rise_billow_water"] = LoadFX("maps/zombie/fx_zombie_body_wtr_billowing");
  1045. level._effect["rise_dust_water"] = LoadFX("maps/zombie/fx_zombie_body_wtr_falling");
  1046.  
  1047. level._effect["rise_burst"] = LoadFX("maps/zombie/fx_mp_zombie_hand_dirt_burst");
  1048. level._effect["rise_billow"] = LoadFX("maps/zombie/fx_mp_zombie_body_dirt_billowing");
  1049. level._effect["rise_dust"] = LoadFX("maps/zombie/fx_mp_zombie_body_dust_falling");
  1050.  
  1051. level._effect["fall_burst"] = LoadFX("maps/zombie/fx_mp_zombie_hand_dirt_burst");
  1052. level._effect["fall_billow"] = LoadFX("maps/zombie/fx_mp_zombie_body_dirt_billowing");
  1053. level._effect["fall_dust"] = LoadFX("maps/zombie/fx_mp_zombie_body_dust_falling");
  1054.  
  1055. // Flamethrower
  1056. level._effect["character_fire_pain_sm"] = LoadFX( "env/fire/fx_fire_player_sm_1sec" );
  1057. level._effect["character_fire_death_sm"] = LoadFX( "env/fire/fx_fire_player_md" );
  1058. level._effect["character_fire_death_torso"] = LoadFX( "env/fire/fx_fire_player_torso" );
  1059.  
  1060. level._effect["def_explosion"] = LoadFX("explosions/fx_default_explosion");
  1061. level._effect["betty_explode"] = LoadFX("weapon/bouncing_betty/fx_explosion_betty_generic");
  1062. }
  1063.  
  1064.  
  1065. // zombie specific anims
  1066. init_standard_zombie_anims()
  1067. {
  1068. // deaths
  1069. level.scr_anim["zombie"]["death1"] = %ai_zombie_death_v1;
  1070. level.scr_anim["zombie"]["death2"] = %ai_zombie_death_v2;
  1071. level.scr_anim["zombie"]["death3"] = %ai_zombie_crawl_death_v1;
  1072. level.scr_anim["zombie"]["death4"] = %ai_zombie_crawl_death_v2;
  1073.  
  1074. // run cycles
  1075.  
  1076. level.scr_anim["zombie"]["walk1"] = %ai_zombie_walk_v1;
  1077. level.scr_anim["zombie"]["walk2"] = %ai_zombie_walk_v2;
  1078. level.scr_anim["zombie"]["walk3"] = %ai_zombie_walk_v3;
  1079. level.scr_anim["zombie"]["walk4"] = %ai_zombie_walk_v4;
  1080. level.scr_anim["zombie"]["walk5"] = %ai_zombie_walk_v6;
  1081. level.scr_anim["zombie"]["walk6"] = %ai_zombie_walk_v7;
  1082. level.scr_anim["zombie"]["walk7"] = %ai_zombie_walk_v9; //was goose step walk - overridden in theatre only (v8)
  1083. level.scr_anim["zombie"]["walk8"] = %ai_zombie_walk_v9;
  1084.  
  1085. level.scr_anim["zombie"]["run1"] = %ai_zombie_walk_fast_v1;
  1086. level.scr_anim["zombie"]["run2"] = %ai_zombie_walk_fast_v2;
  1087. level.scr_anim["zombie"]["run3"] = %ai_zombie_walk_fast_v3;
  1088. level.scr_anim["zombie"]["run4"] = %ai_zombie_run_v2;
  1089. level.scr_anim["zombie"]["run5"] = %ai_zombie_run_v4;
  1090. level.scr_anim["zombie"]["run6"] = %ai_zombie_run_v3;
  1091. //level.scr_anim["zombie"]["run4"] = %ai_zombie_run_v1;
  1092. //level.scr_anim["zombie"]["run6"] = %ai_zombie_run_v4;
  1093.  
  1094. level.scr_anim["zombie"]["sprint1"] = %ai_zombie_sprint_v1;
  1095. level.scr_anim["zombie"]["sprint2"] = %ai_zombie_sprint_v2;
  1096. level.scr_anim["zombie"]["sprint3"] = %ai_zombie_sprint_v1;
  1097. level.scr_anim["zombie"]["sprint4"] = %ai_zombie_sprint_v2;
  1098. //level.scr_anim["zombie"]["sprint3"] = %ai_zombie_sprint_v3;
  1099. //level.scr_anim["zombie"]["sprint3"] = %ai_zombie_sprint_v4;
  1100. //level.scr_anim["zombie"]["sprint4"] = %ai_zombie_sprint_v5;
  1101.  
  1102. // run cycles in prone
  1103. level.scr_anim["zombie"]["crawl1"] = %ai_zombie_crawl;
  1104. level.scr_anim["zombie"]["crawl2"] = %ai_zombie_crawl_v1;
  1105. level.scr_anim["zombie"]["crawl3"] = %ai_zombie_crawl_v2;
  1106. level.scr_anim["zombie"]["crawl4"] = %ai_zombie_crawl_v3;
  1107. level.scr_anim["zombie"]["crawl5"] = %ai_zombie_crawl_v4;
  1108. level.scr_anim["zombie"]["crawl6"] = %ai_zombie_crawl_v5;
  1109. level.scr_anim["zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a;
  1110. level.scr_anim["zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b;
  1111.  
  1112. level.scr_anim["zombie"]["crawl_sprint1"] = %ai_zombie_crawl_sprint;
  1113. level.scr_anim["zombie"]["crawl_sprint2"] = %ai_zombie_crawl_sprint_1;
  1114. level.scr_anim["zombie"]["crawl_sprint3"] = %ai_zombie_crawl_sprint_2;
  1115.  
  1116. if( !isDefined( level._zombie_melee ) )
  1117. {
  1118. level._zombie_melee = [];
  1119. }
  1120. if( !isDefined( level._zombie_walk_melee ) )
  1121. {
  1122. level._zombie_walk_melee = [];
  1123. }
  1124. if( !isDefined( level._zombie_run_melee ) )
  1125. {
  1126. level._zombie_run_melee = [];
  1127. }
  1128.  
  1129. level._zombie_melee["zombie"] = [];
  1130. level._zombie_walk_melee["zombie"] = [];
  1131. level._zombie_run_melee["zombie"] = [];
  1132.  
  1133.  
  1134. level._zombie_melee["zombie"][0] = %ai_zombie_attack_v2; // slow swipes
  1135. level._zombie_melee["zombie"][1] = %ai_zombie_attack_v4; // single left swipe
  1136. level._zombie_melee["zombie"][2] = %ai_zombie_attack_v6; // wierd single
  1137. level._zombie_melee["zombie"][3] = %ai_zombie_attack_v1; // DOUBLE SWIPE
  1138. level._zombie_melee["zombie"][4] = %ai_zombie_attack_forward_v1; // DOUBLE SWIPE
  1139. level._zombie_melee["zombie"][5] = %ai_zombie_attack_forward_v2; // slow DOUBLE SWIPE
  1140.  
  1141. level._zombie_run_melee["zombie"][0] = %ai_zombie_run_attack_v1; // fast single right
  1142. level._zombie_run_melee["zombie"][1] = %ai_zombie_run_attack_v2; // fast double swipe
  1143. level._zombie_run_melee["zombie"][2] = %ai_zombie_run_attack_v3; // fast swipe
  1144.  
  1145. if( isDefined( level.zombie_anim_override ) )
  1146. {
  1147. [[ level.zombie_anim_override ]]();
  1148. }
  1149.  
  1150. // melee in walk
  1151. level._zombie_walk_melee["zombie"][0] = %ai_zombie_walk_attack_v1; // fast single right swipe
  1152. level._zombie_walk_melee["zombie"][1] = %ai_zombie_walk_attack_v2; // slow right/left single hit
  1153. level._zombie_walk_melee["zombie"][2] = %ai_zombie_walk_attack_v3; // fast single left swipe
  1154. level._zombie_walk_melee["zombie"][3] = %ai_zombie_walk_attack_v4; // slow single right swipe
  1155.  
  1156. // melee in crawl
  1157. if( !isDefined( level._zombie_melee_crawl ) )
  1158. {
  1159. level._zombie_melee_crawl = [];
  1160. }
  1161. level._zombie_melee_crawl["zombie"] = [];
  1162. level._zombie_melee_crawl["zombie"][0] = %ai_zombie_attack_crawl;
  1163. level._zombie_melee_crawl["zombie"][1] = %ai_zombie_attack_crawl_lunge;
  1164.  
  1165. if( !isDefined( level._zombie_stumpy_melee ) )
  1166. {
  1167. level._zombie_stumpy_melee = [];
  1168. }
  1169. level._zombie_stumpy_melee["zombie"] = [];
  1170. level._zombie_stumpy_melee["zombie"][0] = %ai_zombie_walk_on_hands_shot_a;
  1171. level._zombie_stumpy_melee["zombie"][1] = %ai_zombie_walk_on_hands_shot_b;
  1172. //level._zombie_melee_crawl["zombie"][2] = %ai_zombie_crawl_attack_A;
  1173.  
  1174. // tesla deaths
  1175. if( !isDefined( level._zombie_tesla_death ) )
  1176. {
  1177. level._zombie_tesla_death = [];
  1178. }
  1179. level._zombie_tesla_death["zombie"] = [];
  1180. level._zombie_tesla_death["zombie"][0] = %ai_zombie_tesla_death_a;
  1181. level._zombie_tesla_death["zombie"][1] = %ai_zombie_tesla_death_b;
  1182. level._zombie_tesla_death["zombie"][2] = %ai_zombie_tesla_death_c;
  1183. level._zombie_tesla_death["zombie"][3] = %ai_zombie_tesla_death_d;
  1184. level._zombie_tesla_death["zombie"][4] = %ai_zombie_tesla_death_e;
  1185.  
  1186. if( !isDefined( level._zombie_tesla_crawl_death ) )
  1187. {
  1188. level._zombie_tesla_crawl_death = [];
  1189. }
  1190. level._zombie_tesla_crawl_death["zombie"] = [];
  1191. level._zombie_tesla_crawl_death["zombie"][0] = %ai_zombie_tesla_crawl_death_a;
  1192. level._zombie_tesla_crawl_death["zombie"][1] = %ai_zombie_tesla_crawl_death_b;
  1193.  
  1194. // thundergun knockdowns and getups
  1195. if( !isDefined( level._zombie_knockdowns ) )
  1196. {
  1197. level._zombie_knockdowns = [];
  1198. }
  1199. level._zombie_knockdowns["zombie"] = [];
  1200. level._zombie_knockdowns["zombie"]["front"] = [];
  1201.  
  1202. level._zombie_knockdowns["zombie"]["front"]["no_legs"] = [];
  1203. level._zombie_knockdowns["zombie"]["front"]["no_legs"][0] = %ai_zombie_thundergun_hit_armslegsforward;
  1204. level._zombie_knockdowns["zombie"]["front"]["no_legs"][1] = %ai_zombie_thundergun_hit_doublebounce;
  1205. level._zombie_knockdowns["zombie"]["front"]["no_legs"][2] = %ai_zombie_thundergun_hit_forwardtoface;
  1206.  
  1207. level._zombie_knockdowns["zombie"]["front"]["has_legs"] = [];
  1208.  
  1209. level._zombie_knockdowns["zombie"]["front"]["has_legs"][0] = %ai_zombie_thundergun_hit_armslegsforward;
  1210. level._zombie_knockdowns["zombie"]["front"]["has_legs"][1] = %ai_zombie_thundergun_hit_doublebounce;
  1211. level._zombie_knockdowns["zombie"]["front"]["has_legs"][2] = %ai_zombie_thundergun_hit_upontoback;
  1212. level._zombie_knockdowns["zombie"]["front"]["has_legs"][3] = %ai_zombie_thundergun_hit_forwardtoface;
  1213. level._zombie_knockdowns["zombie"]["front"]["has_legs"][4] = %ai_zombie_thundergun_hit_armslegsforward;
  1214. level._zombie_knockdowns["zombie"]["front"]["has_legs"][5] = %ai_zombie_thundergun_hit_forwardtoface;
  1215. level._zombie_knockdowns["zombie"]["front"]["has_legs"][6] = %ai_zombie_thundergun_hit_stumblefall;
  1216. level._zombie_knockdowns["zombie"]["front"]["has_legs"][7] = %ai_zombie_thundergun_hit_armslegsforward;
  1217. level._zombie_knockdowns["zombie"]["front"]["has_legs"][8] = %ai_zombie_thundergun_hit_doublebounce;
  1218. level._zombie_knockdowns["zombie"]["front"]["has_legs"][9] = %ai_zombie_thundergun_hit_upontoback;
  1219. level._zombie_knockdowns["zombie"]["front"]["has_legs"][10] = %ai_zombie_thundergun_hit_forwardtoface;
  1220. level._zombie_knockdowns["zombie"]["front"]["has_legs"][11] = %ai_zombie_thundergun_hit_armslegsforward;
  1221. level._zombie_knockdowns["zombie"]["front"]["has_legs"][12] = %ai_zombie_thundergun_hit_forwardtoface;
  1222. level._zombie_knockdowns["zombie"]["front"]["has_legs"][13] = %ai_zombie_thundergun_hit_deadfallknee;
  1223. level._zombie_knockdowns["zombie"]["front"]["has_legs"][14] = %ai_zombie_thundergun_hit_armslegsforward;
  1224. level._zombie_knockdowns["zombie"]["front"]["has_legs"][15] = %ai_zombie_thundergun_hit_doublebounce;
  1225. level._zombie_knockdowns["zombie"]["front"]["has_legs"][16] = %ai_zombie_thundergun_hit_upontoback;
  1226. level._zombie_knockdowns["zombie"]["front"]["has_legs"][17] = %ai_zombie_thundergun_hit_forwardtoface;
  1227. level._zombie_knockdowns["zombie"]["front"]["has_legs"][18] = %ai_zombie_thundergun_hit_armslegsforward;
  1228. level._zombie_knockdowns["zombie"]["front"]["has_legs"][19] = %ai_zombie_thundergun_hit_forwardtoface;
  1229. level._zombie_knockdowns["zombie"]["front"]["has_legs"][20] = %ai_zombie_thundergun_hit_flatonback;
  1230.  
  1231. level._zombie_knockdowns["zombie"]["left"] = [];
  1232. level._zombie_knockdowns["zombie"]["left"][0] = %ai_zombie_thundergun_hit_legsout_right;
  1233.  
  1234. level._zombie_knockdowns["zombie"]["right"] = [];
  1235. level._zombie_knockdowns["zombie"]["right"][0] = %ai_zombie_thundergun_hit_legsout_left;
  1236.  
  1237. level._zombie_knockdowns["zombie"]["back"] = [];
  1238. level._zombie_knockdowns["zombie"]["back"][0] = %ai_zombie_thundergun_hit_faceplant;
  1239.  
  1240. if( !isDefined( level._zombie_getups ) )
  1241. {
  1242. level._zombie_getups = [];
  1243. }
  1244. level._zombie_getups["zombie"] = [];
  1245. level._zombie_getups["zombie"]["back"] = [];
  1246.  
  1247. level._zombie_getups["zombie"]["back"]["early"] = [];
  1248. level._zombie_getups["zombie"]["back"]["early"][0] = %ai_zombie_thundergun_getup_b;
  1249. level._zombie_getups["zombie"]["back"]["early"][1] = %ai_zombie_thundergun_getup_c;
  1250.  
  1251. level._zombie_getups["zombie"]["back"]["late"] = [];
  1252. level._zombie_getups["zombie"]["back"]["late"][0] = %ai_zombie_thundergun_getup_b;
  1253. level._zombie_getups["zombie"]["back"]["late"][1] = %ai_zombie_thundergun_getup_c;
  1254. level._zombie_getups["zombie"]["back"]["late"][2] = %ai_zombie_thundergun_getup_quick_b;
  1255. level._zombie_getups["zombie"]["back"]["late"][3] = %ai_zombie_thundergun_getup_quick_c;
  1256.  
  1257. level._zombie_getups["zombie"]["belly"] = [];
  1258.  
  1259. level._zombie_getups["zombie"]["belly"]["early"] = [];
  1260. level._zombie_getups["zombie"]["belly"]["early"][0] = %ai_zombie_thundergun_getup_a;
  1261.  
  1262. level._zombie_getups["zombie"]["belly"]["late"] = [];
  1263. level._zombie_getups["zombie"]["belly"]["late"][0] = %ai_zombie_thundergun_getup_a;
  1264. level._zombie_getups["zombie"]["belly"]["late"][1] = %ai_zombie_thundergun_getup_quick_a;
  1265.  
  1266. // freezegun deaths
  1267. if( !isDefined( level._zombie_freezegun_death ) )
  1268. {
  1269. level._zombie_freezegun_death = [];
  1270. }
  1271. level._zombie_freezegun_death["zombie"] = [];
  1272. level._zombie_freezegun_death["zombie"][0] = %ai_zombie_freeze_death_a;
  1273. level._zombie_freezegun_death["zombie"][1] = %ai_zombie_freeze_death_b;
  1274. level._zombie_freezegun_death["zombie"][2] = %ai_zombie_freeze_death_c;
  1275. level._zombie_freezegun_death["zombie"][3] = %ai_zombie_freeze_death_d;
  1276. level._zombie_freezegun_death["zombie"][4] = %ai_zombie_freeze_death_e;
  1277.  
  1278. if( !isDefined( level._zombie_freezegun_death_missing_legs ) )
  1279. {
  1280. level._zombie_freezegun_death_missing_legs = [];
  1281. }
  1282. level._zombie_freezegun_death_missing_legs["zombie"] = [];
  1283. level._zombie_freezegun_death_missing_legs["zombie"][0] = %ai_zombie_crawl_freeze_death_01;
  1284. level._zombie_freezegun_death_missing_legs["zombie"][1] = %ai_zombie_crawl_freeze_death_02;
  1285.  
  1286. // deaths
  1287. if( !isDefined( level._zombie_deaths ) )
  1288. {
  1289. level._zombie_deaths = [];
  1290. }
  1291. level._zombie_deaths["zombie"] = [];
  1292. level._zombie_deaths["zombie"][0] = %ch_dazed_a_death;
  1293. level._zombie_deaths["zombie"][1] = %ch_dazed_b_death;
  1294. level._zombie_deaths["zombie"][2] = %ch_dazed_c_death;
  1295. level._zombie_deaths["zombie"][3] = %ch_dazed_d_death;
  1296.  
  1297. /*
  1298. ground crawl
  1299. */
  1300.  
  1301. if( !isDefined( level._zombie_rise_anims ) )
  1302. {
  1303. level._zombie_rise_anims = [];
  1304. }
  1305.  
  1306. // set up the arrays
  1307. level._zombie_rise_anims["zombie"] = [];
  1308.  
  1309. //level._zombie_rise_anims["zombie"][1]["walk"][0] = %ai_zombie_traverse_ground_v1_crawl;
  1310. level._zombie_rise_anims["zombie"][1]["walk"][0] = %ai_zombie_traverse_ground_v1_walk;
  1311.  
  1312. //level._zombie_rise_anims["zombie"][1]["run"][0] = %ai_zombie_traverse_ground_v1_crawlfast;
  1313. level._zombie_rise_anims["zombie"][1]["run"][0] = %ai_zombie_traverse_ground_v1_run;
  1314.  
  1315. level._zombie_rise_anims["zombie"][1]["sprint"][0] = %ai_zombie_traverse_ground_climbout_fast;
  1316.  
  1317. //level._zombie_rise_anims["zombie"][2]["walk"][0] = %ai_zombie_traverse_ground_v2_walk; //!broken
  1318. level._zombie_rise_anims["zombie"][2]["walk"][0] = %ai_zombie_traverse_ground_v2_walk_altA;
  1319. //level._zombie_rise_anims["zombie"][2]["walk"][2] = %ai_zombie_traverse_ground_v2_walk_altB;//!broken
  1320.  
  1321. // ground crawl death
  1322. if( !isDefined( level._zombie_rise_death_anims ) )
  1323. {
  1324. level._zombie_rise_death_anims = [];
  1325. }
  1326.  
  1327. level._zombie_rise_death_anims["zombie"] = [];
  1328.  
  1329. level._zombie_rise_death_anims["zombie"][1]["in"][0] = %ai_zombie_traverse_ground_v1_deathinside;
  1330. level._zombie_rise_death_anims["zombie"][1]["in"][1] = %ai_zombie_traverse_ground_v1_deathinside_alt;
  1331.  
  1332. level._zombie_rise_death_anims["zombie"][1]["out"][0] = %ai_zombie_traverse_ground_v1_deathoutside;
  1333. level._zombie_rise_death_anims["zombie"][1]["out"][1] = %ai_zombie_traverse_ground_v1_deathoutside_alt;
  1334.  
  1335. level._zombie_rise_death_anims["zombie"][2]["in"][0] = %ai_zombie_traverse_ground_v2_death_low;
  1336. level._zombie_rise_death_anims["zombie"][2]["in"][1] = %ai_zombie_traverse_ground_v2_death_low_alt;
  1337.  
  1338. level._zombie_rise_death_anims["zombie"][2]["out"][0] = %ai_zombie_traverse_ground_v2_death_high;
  1339. level._zombie_rise_death_anims["zombie"][2]["out"][1] = %ai_zombie_traverse_ground_v2_death_high_alt;
  1340.  
  1341. //taunts
  1342. if( !isDefined( level._zombie_run_taunt ) )
  1343. {
  1344. level._zombie_run_taunt = [];
  1345. }
  1346. if( !isDefined( level._zombie_board_taunt ) )
  1347. {
  1348. level._zombie_board_taunt = [];
  1349. }
  1350. level._zombie_run_taunt["zombie"] = [];
  1351. level._zombie_board_taunt["zombie"] = [];
  1352.  
  1353. //level._zombie_taunt["zombie"][0] = %ai_zombie_taunts_1;
  1354. //level._zombie_taunt["zombie"][1] = %ai_zombie_taunts_4;
  1355. //level._zombie_taunt["zombie"][2] = %ai_zombie_taunts_5b;
  1356. //level._zombie_taunt["zombie"][3] = %ai_zombie_taunts_5c;
  1357. //level._zombie_taunt["zombie"][4] = %ai_zombie_taunts_5d;
  1358. //level._zombie_taunt["zombie"][5] = %ai_zombie_taunts_5e;
  1359. //level._zombie_taunt["zombie"][6] = %ai_zombie_taunts_5f;
  1360. //level._zombie_taunt["zombie"][7] = %ai_zombie_taunts_7;
  1361. //level._zombie_taunt["zombie"][8] = %ai_zombie_taunts_9;
  1362. //level._zombie_taunt["zombie"][8] = %ai_zombie_taunts_11;
  1363. //level._zombie_taunt["zombie"][8] = %ai_zombie_taunts_12;
  1364.  
  1365. level._zombie_board_taunt["zombie"][0] = %ai_zombie_taunts_4;
  1366. level._zombie_board_taunt["zombie"][1] = %ai_zombie_taunts_7;
  1367. level._zombie_board_taunt["zombie"][2] = %ai_zombie_taunts_9;
  1368. level._zombie_board_taunt["zombie"][3] = %ai_zombie_taunts_5b;
  1369. level._zombie_board_taunt["zombie"][4] = %ai_zombie_taunts_5c;
  1370. level._zombie_board_taunt["zombie"][5] = %ai_zombie_taunts_5d;
  1371. level._zombie_board_taunt["zombie"][6] = %ai_zombie_taunts_5e;
  1372. level._zombie_board_taunt["zombie"][7] = %ai_zombie_taunts_5f;
  1373. }
  1374.  
  1375. init_anims()
  1376. {
  1377. init_standard_zombie_anims();
  1378. }
  1379.  
  1380. // Initialize any animscript related variables
  1381. init_animscripts()
  1382. {
  1383. // Setup the animscripts, then override them (we call this just incase an AI has not yet spawned)
  1384. animscripts\zombie_init::firstInit();
  1385.  
  1386. anim.idleAnimArray ["stand"] = [];
  1387. anim.idleAnimWeights ["stand"] = [];
  1388. anim.idleAnimArray ["stand"][0][0] = %ai_zombie_idle_v1_delta;
  1389. anim.idleAnimWeights ["stand"][0][0] = 10;
  1390.  
  1391. anim.idleAnimArray ["crouch"] = [];
  1392. anim.idleAnimWeights ["crouch"] = [];
  1393. anim.idleAnimArray ["crouch"][0][0] = %ai_zombie_idle_crawl_delta;
  1394. anim.idleAnimWeights ["crouch"][0][0] = 10;
  1395. }
  1396.  
  1397. // Handles the intro screen
  1398. zombie_intro_screen( string1, string2, string3, string4, string5 )
  1399. {
  1400. flag_wait( "all_players_connected" );
  1401. }
  1402.  
  1403. players_playing()
  1404. {
  1405. // initialize level.players_playing
  1406. players = get_players();
  1407. level.players_playing = players.size;
  1408.  
  1409. wait( 20 );
  1410.  
  1411. players = get_players();
  1412. level.players_playing = players.size;
  1413. }
  1414.  
  1415.  
  1416. // Init some additional settings based on difficulty and number of players
  1417. //
  1418. difficulty_init()
  1419. {
  1420. flag_wait( "all_players_connected" );
  1421.  
  1422. difficulty =1;
  1423. table = "mp/zombiemode.csv";
  1424. column = int(difficulty)+1;
  1425. players = get_players();
  1426. points = 500;
  1427.  
  1428.  
  1429. // Get individual starting points
  1430. points = set_zombie_var( ("zombie_score_start_"+players.size+"p"), 3000, false, column );
  1431. /#
  1432. if( GetDvarInt( #"zombie_cheat" ) >= 1 )
  1433. {
  1434. points = 100000;
  1435. }
  1436. #/
  1437. for ( p=0; p<players.size; p++ )
  1438. {
  1439. players[p].score = points;
  1440. players[p].score_total = players[p].score;
  1441. players[p].old_score = players[p].score;
  1442. }
  1443.  
  1444. // Get team starting points
  1445. points = set_zombie_var( ("zombie_team_score_start_"+players.size+"p"), 2000, false, column );
  1446. /#
  1447. if( GetDvarInt( #"zombie_cheat" ) >= 1 )
  1448. {
  1449. points = 100000;
  1450. }
  1451. #/
  1452. for ( tp = 0; tp<level.team_pool.size; tp++ )
  1453. {
  1454. pool = level.team_pool[ tp ];
  1455. pool.score = points;
  1456. pool.old_score = pool.score;
  1457. pool.score_total = pool.score;
  1458. }
  1459.  
  1460. // Other difficulty-specific changes
  1461. switch ( difficulty )
  1462. {
  1463. case "0":
  1464. case "1":
  1465. break;
  1466. case "2":
  1467. level.first_round = false;
  1468. level.round_number = 8;
  1469. break;
  1470. case "3":
  1471. level.first_round = false;
  1472. level.round_number = 18;
  1473. break;
  1474. default:
  1475. break;
  1476. }
  1477.  
  1478. if( level.mutators["mutator_quickStart"] )
  1479. {
  1480. level.first_round = false;
  1481. level.round_number = 5;
  1482. }
  1483. }
  1484.  
  1485.  
  1486. //
  1487. // NETWORK SECTION ====================================================================== //
  1488. //
  1489.  
  1490. watchTakenDamage()
  1491. {
  1492. self endon( "disconnect" );
  1493. self endon( "death" );
  1494.  
  1495. self.has_taken_damage = false;
  1496. while(1)
  1497. {
  1498. self waittill("damage", damage_amount );
  1499.  
  1500. if ( 0 < damage_amount )
  1501. {
  1502. self.has_taken_damage = true;
  1503. return;
  1504. }
  1505. }
  1506. }
  1507.  
  1508. onPlayerConnect()
  1509. {
  1510. for( ;; )
  1511. {
  1512. level waittill( "connecting", player );
  1513.  
  1514. player.entity_num = player GetEntityNumber();
  1515. player thread onPlayerSpawned();
  1516. player thread onPlayerDisconnect();
  1517. player thread player_revive_monitor();
  1518.  
  1519. player freezecontrols( true );
  1520.  
  1521. player thread watchTakenDamage();
  1522.  
  1523. player.score = 0;
  1524. player.score_total = player.score;
  1525. player.old_score = player.score;
  1526.  
  1527. player.is_zombie = false;
  1528. player.initialized = false;
  1529. player.zombification_time = 0;
  1530. player.enableText = true;
  1531.  
  1532. player.team_num = 0;
  1533.  
  1534. player setTeamForEntity( "allies" );
  1535.  
  1536. //player maps\_zombiemode_protips::player_init();
  1537.  
  1538. // DCS 090910: now that player can destroy some barricades before set.
  1539. player thread maps\_zombiemode_blockers::rebuild_barrier_reward_reset();
  1540. }
  1541. }
  1542.  
  1543. onPlayerConnect_clientDvars()
  1544. {
  1545. self SetClientDvars( "cg_deadChatWithDead", "1",
  1546. "cg_deadChatWithTeam", "1",
  1547. "cg_deadHearTeamLiving", "1",
  1548. "cg_deadHearAllLiving", "1",
  1549. "cg_everyoneHearsEveryone", "1",
  1550. "compass", "0",
  1551. "hud_showStance", "0",
  1552. "cg_thirdPerson", "0",
  1553. "cg_fov", "65",
  1554. "cg_thirdPersonAngle", "0",
  1555. "ammoCounterHide", "1",
  1556. "miniscoreboardhide", "1",
  1557. "cg_drawSpectatorMessages", "0",
  1558. "ui_hud_hardcore", "0",
  1559. "playerPushAmount", "1" );
  1560.  
  1561. self SetDepthOfField( 0, 0, 512, 4000, 4, 0 );
  1562.  
  1563. // Enabling the FPS counter in ship for now
  1564. //self setclientdvar( "cg_drawfps", "1" );
  1565.  
  1566. self setClientDvar( "aim_lockon_pitch_strength", 0.0 );
  1567.  
  1568. if(!level.wii)
  1569. {
  1570. //self SetClientDvar("r_enablePlayerShadow", 1);
  1571. }
  1572. }
  1573.  
  1574.  
  1575.  
  1576. checkForAllDead()
  1577. {
  1578. players = get_players();
  1579. count = 0;
  1580. for( i = 0; i < players.size; i++ )
  1581. {
  1582. if( !(players[i] maps\_laststand::player_is_in_laststand()) && !(players[i].sessionstate == "spectator") )
  1583. {
  1584. count++;
  1585. }
  1586. }
  1587.  
  1588. if( count==0 )
  1589. {
  1590. level notify( "end_game" );
  1591. }
  1592. }
  1593.  
  1594.  
  1595. onPlayerDisconnect()
  1596. {
  1597. self waittill( "disconnect" );
  1598. self remove_from_spectate_list();
  1599. self checkForAllDead();
  1600. }
  1601.  
  1602.  
  1603. //
  1604. // Runs when the player spawns into the map
  1605. // self is the player.surprise!
  1606. //
  1607. onPlayerSpawned()
  1608. {
  1609. self endon( "disconnect" );
  1610.  
  1611. for( ;; )
  1612. {
  1613. self waittill( "spawned_player" );
  1614. self giveweapon("rnmaammo_zm");
  1615. self switchtoweapon("rnmaammo_zm");
  1616. self freezecontrols( false );
  1617.  
  1618. self init_player_offhand_weapons();
  1619.  
  1620. self enablehealthshield( false );
  1621. /#
  1622. if ( GetDvarInt( #"zombie_cheat" ) >= 1 && GetDvarInt( #"zombie_cheat" ) <= 3 )
  1623. {
  1624. self EnableInvulnerability();
  1625. }
  1626. #/
  1627.  
  1628. self PlayerKnockback( false );
  1629.  
  1630. self SetClientDvars( "cg_thirdPerson", "0",
  1631. "cg_fov", "65",
  1632. "cg_thirdPersonAngle", "0" );
  1633.  
  1634. self SetDepthOfField( 0, 0, 512, 4000, 4, 0 );
  1635.  
  1636. self cameraactivate(false);
  1637.  
  1638. self add_to_spectate_list();
  1639.  
  1640. self.num_perks = 0;
  1641. self.on_lander_last_stand = undefined;
  1642.  
  1643. if ( is_true( level.player_out_of_playable_area_monitor ) )
  1644. {
  1645. self thread player_out_of_playable_area_monitor();
  1646. }
  1647.  
  1648. if ( is_true( level.player_too_many_weapons_monitor ) )
  1649. {
  1650. self thread [[level.player_too_many_weapons_monitor_func]]();
  1651. }
  1652.  
  1653. if( isdefined( self.initialized ) )
  1654. {
  1655. if( self.initialized == false )
  1656. {
  1657. self.initialized = true;
  1658.  
  1659. self freezecontrols( true ); // first spawn only, intro_black_screen will pull them out of it
  1660.  
  1661. // ww: set the is_drinking variable
  1662. self.is_drinking = 0;
  1663.  
  1664. // set the initial score on the hud
  1665. self maps\_zombiemode_score::set_player_score_hud( true );
  1666. self thread player_zombie_breadcrumb();
  1667.  
  1668. // This will keep checking to see if you're trying to use an ability.
  1669. //self thread maps\_zombiemode_ability::hardpointItemWaiter();
  1670.  
  1671. //self thread maps\_zombiemode_ability::hardPointItemSelector();
  1672.  
  1673. //Init stat tracking variables
  1674. self.stats["kills"] = 0;
  1675. self.stats["score"] = 0;
  1676. self.stats["downs"] = 0;
  1677. self.stats["revives"] = 0;
  1678. self.stats["perks"] = 0;
  1679. self.stats["headshots"] = 0;
  1680. self.stats["zombie_gibs"] = 0;
  1681.  
  1682. //track damage taken by this player
  1683. self.stats["damage_taken"] = 0;
  1684.  
  1685. //track player distance traveled
  1686. self.stats["distance_traveled"] = 0;
  1687. self thread player_monitor_travel_dist();
  1688.  
  1689. self thread player_grenade_watcher();
  1690.  
  1691. }
  1692. }
  1693. }
  1694. }
  1695.  
  1696.  
  1697. spawn_life_brush( origin, radius, height )
  1698. {
  1699. life_brush = spawn( "trigger_radius", origin, 0, radius, height );
  1700. life_brush.script_noteworthy = "life_brush";
  1701.  
  1702. return life_brush;
  1703. }
  1704.  
  1705.  
  1706. in_life_brush()
  1707. {
  1708. life_brushes = getentarray( "life_brush", "script_noteworthy" );
  1709.  
  1710. if ( !IsDefined( life_brushes ) )
  1711. {
  1712. return false;
  1713. }
  1714.  
  1715. for ( i = 0; i < life_brushes.size; i++ )
  1716. {
  1717.  
  1718. if ( self IsTouching( life_brushes[i] ) )
  1719. {
  1720. return true;
  1721. }
  1722. }
  1723.  
  1724. return false;
  1725. }
  1726.  
  1727.  
  1728. spawn_kill_brush( origin, radius, height )
  1729. {
  1730. kill_brush = spawn( "trigger_radius", origin, 0, radius, height );
  1731. kill_brush.script_noteworthy = "kill_brush";
  1732.  
  1733. return kill_brush;
  1734. }
  1735.  
  1736.  
  1737. in_kill_brush()
  1738. {
  1739. kill_brushes = getentarray( "kill_brush", "script_noteworthy" );
  1740.  
  1741. if ( !IsDefined( kill_brushes ) )
  1742. {
  1743. return false;
  1744. }
  1745.  
  1746. for ( i = 0; i < kill_brushes.size; i++ )
  1747. {
  1748.  
  1749. if ( self IsTouching( kill_brushes[i] ) )
  1750. {
  1751. return true;
  1752. }
  1753. }
  1754.  
  1755. return false;
  1756. }
  1757.  
  1758.  
  1759. in_enabled_playable_area()
  1760. {
  1761. playable_area = getentarray( "player_volume", "script_noteworthy" );
  1762.  
  1763. if( !IsDefined( playable_area ) )
  1764. {
  1765. return false;
  1766. }
  1767.  
  1768. for ( i = 0; i < playable_area.size; i++ )
  1769. {
  1770. if ( maps\_zombiemode_zone_manager::zone_is_enabled( playable_area[i].targetname ) && self IsTouching( playable_area[i] ) )
  1771. {
  1772. return true;
  1773. }
  1774. }
  1775.  
  1776. return false;
  1777. }
  1778.  
  1779.  
  1780. get_player_out_of_playable_area_monitor_wait_time()
  1781. {
  1782. /#
  1783. if ( is_true( level.check_kill_thread_every_frame ) )
  1784. {
  1785. return 0.05;
  1786. }
  1787. #/
  1788.  
  1789. return 3;
  1790. }
  1791.  
  1792.  
  1793. player_out_of_playable_area_monitor()
  1794. {
  1795. self notify( "stop_player_out_of_playable_area_monitor" );
  1796. self endon( "stop_player_out_of_playable_area_monitor" );
  1797. self endon( "disconnect" );
  1798. level endon( "end_game" );
  1799.  
  1800. // load balancing
  1801. wait( (0.15 * self GetEntityNumber()) );
  1802.  
  1803. while ( true )
  1804. {
  1805. // skip over players in spectate, otherwise Sam keeps laughing every 3 seconds since their corpse is still invisibly in a kill area
  1806. if ( self.sessionstate == "spectator" )
  1807. {
  1808. wait( get_player_out_of_playable_area_monitor_wait_time() );
  1809. continue;
  1810. }
  1811.  
  1812. if ( !self in_life_brush() && (self in_kill_brush() || !self in_enabled_playable_area()) )
  1813. {
  1814. if ( !isdefined( level.player_out_of_playable_area_monitor_callback ) || self [[level.player_out_of_playable_area_monitor_callback]]() )
  1815. {
  1816. /#
  1817. //iprintlnbold( "out of playable" );
  1818. if ( isdefined( self isinmovemode( "ufo", "noclip" ) ) || is_true( level.disable_kill_thread ) || GetDvarInt( "zombie_cheat" ) > 0 )
  1819. {
  1820. wait( get_player_out_of_playable_area_monitor_wait_time() );
  1821. continue;
  1822. }
  1823. #/
  1824. if( is_true( level.player_4_vox_override ) )
  1825. {
  1826. self playlocalsound( "zmb_laugh_rich" );
  1827. }
  1828. else
  1829. {
  1830. self playlocalsound( "zmb_laugh_child" );
  1831. }
  1832.  
  1833. wait( 0.5 );
  1834.  
  1835. if ( getplayers().size == 1 && flag( "solo_game" ) && is_true( self.waiting_to_revive ) )
  1836. {
  1837. level notify( "end_game" );
  1838. }
  1839. else
  1840. {
  1841. self.lives = 0;
  1842. self dodamage( self.health + 1000, self.origin );
  1843. self.bleedout_time = 0;
  1844. }
  1845. }
  1846. }
  1847.  
  1848. wait( get_player_out_of_playable_area_monitor_wait_time() );
  1849. }
  1850. }
  1851.  
  1852.  
  1853. get_player_too_many_weapons_monitor_wait_time()
  1854. {
  1855. return 3;
  1856. }
  1857.  
  1858.  
  1859. player_too_many_weapons_monitor_takeaway_simultaneous( primary_weapons_to_take )
  1860. {
  1861. self endon( "player_too_many_weapons_monitor_takeaway_sequence_done" );
  1862.  
  1863. self waittill_any( "player_downed", "replace_weapon_powerup" );
  1864.  
  1865. for ( i = 0; i < primary_weapons_to_take.size; i++ )
  1866. {
  1867. self TakeWeapon( primary_weapons_to_take[i] );
  1868. }
  1869.  
  1870. self maps\_zombiemode_score::minus_to_player_score( self.score );
  1871. self GiveWeapon( "m1911_zm" );
  1872. if ( !self maps\_laststand::player_is_in_laststand() )
  1873. {
  1874. self decrement_is_drinking();
  1875. }
  1876. else if ( flag( "solo_game" ) )
  1877. {
  1878. self.score_lost_when_downed = 0;
  1879. }
  1880.  
  1881. self notify( "player_too_many_weapons_monitor_takeaway_sequence_done" );
  1882. }
  1883.  
  1884.  
  1885. player_too_many_weapons_monitor_takeaway_sequence( primary_weapons_to_take )
  1886. {
  1887. self thread player_too_many_weapons_monitor_takeaway_simultaneous( primary_weapons_to_take );
  1888.  
  1889. self endon( "player_downed" );
  1890. self endon( "replace_weapon_powerup" );
  1891.  
  1892. self increment_is_drinking();
  1893. score_decrement = round_up_to_ten( int( self.score / (primary_weapons_to_take.size + 1) ) );
  1894.  
  1895. for ( i = 0; i < primary_weapons_to_take.size; i++ )
  1896. {
  1897. if( is_true( level.player_4_vox_override ) )
  1898. {
  1899. self playlocalsound( "zmb_laugh_rich" );
  1900. }
  1901. else
  1902. {
  1903. self playlocalsound( "zmb_laugh_child" );
  1904. }
  1905. self SwitchToWeapon( primary_weapons_to_take[i] );
  1906. self maps\_zombiemode_score::minus_to_player_score( score_decrement );
  1907. wait( 3 );
  1908.  
  1909. self TakeWeapon( primary_weapons_to_take[i] );
  1910. }
  1911.  
  1912. if( is_true( level.player_4_vox_override ) )
  1913. {
  1914. self playlocalsound( "zmb_laugh_rich" );
  1915. }
  1916. else
  1917. {
  1918. self playlocalsound( "zmb_laugh_child" );
  1919. }
  1920. self maps\_zombiemode_score::minus_to_player_score( self.score );
  1921. wait( 1 );
  1922. self GiveWeapon( "m1911_zm" );
  1923. self SwitchToWeapon( "m1911_zm" );
  1924. self decrement_is_drinking();
  1925.  
  1926. self notify( "player_too_many_weapons_monitor_takeaway_sequence_done" );
  1927. }
  1928.  
  1929.  
  1930. player_too_many_weapons_monitor()
  1931. {
  1932. self notify( "stop_player_too_many_weapons_monitor" );
  1933. self endon( "stop_player_too_many_weapons_monitor" );
  1934. self endon( "disconnect" );
  1935. level endon( "end_game" );
  1936.  
  1937. // load balancing
  1938. wait( (0.15 * self GetEntityNumber()) );
  1939.  
  1940. while ( true )
  1941. {
  1942. if ( self has_powerup_weapon() || self maps\_laststand::player_is_in_laststand() || self.sessionstate == "spectator" )
  1943. {
  1944. wait( get_player_too_many_weapons_monitor_wait_time() );
  1945. continue;
  1946. }
  1947.  
  1948. /#
  1949. if ( GetDvarInt( "zombie_cheat" ) > 0 )
  1950. {
  1951. wait( get_player_too_many_weapons_monitor_wait_time() );
  1952. continue;
  1953. }
  1954. #/
  1955.  
  1956. primary_weapons_to_take = [];
  1957. weapon_limit = 2;
  1958. if ( self HasPerk( "specialty_additionalprimaryweapon" ) )
  1959. {
  1960. weapon_limit = 3;
  1961. }
  1962.  
  1963. primaryWeapons = self GetWeaponsListPrimaries();
  1964. for ( i = 0; i < primaryWeapons.size; i++ )
  1965. {
  1966. if ( maps\_zombiemode_weapons::is_weapon_included( primaryWeapons[i] ) || maps\_zombiemode_weapons::is_weapon_upgraded( primaryWeapons[i] ) )
  1967. {
  1968. primary_weapons_to_take[primary_weapons_to_take.size] = primaryWeapons[i];
  1969. }
  1970. }
  1971.  
  1972. if ( primary_weapons_to_take.size > weapon_limit )
  1973. {
  1974. if ( !isdefined( level.player_too_many_weapons_monitor_callback ) || self [[level.player_too_many_weapons_monitor_callback]]( primary_weapons_to_take ) )
  1975. {
  1976. self thread player_too_many_weapons_monitor_takeaway_sequence( primary_weapons_to_take );
  1977. self waittill( "player_too_many_weapons_monitor_takeaway_sequence_done" );
  1978. }
  1979. }
  1980.  
  1981. wait( get_player_too_many_weapons_monitor_wait_time() );
  1982. }
  1983. }
  1984.  
  1985.  
  1986. player_monitor_travel_dist()
  1987. {
  1988. self endon("disconnect");
  1989.  
  1990. prevpos = self.origin;
  1991. while(1)
  1992. {
  1993. wait .1;
  1994.  
  1995. self.stats["distance_traveled"] += distance( self.origin, prevpos );
  1996. prevpos = self.origin;
  1997. }
  1998. }
  1999.  
  2000. player_grenade_watcher()
  2001. {
  2002. self endon( "disconnect" );
  2003.  
  2004. while ( 1 )
  2005. {
  2006. self waittill( "grenade_fire", grenade, weapName );
  2007.  
  2008. if( isdefined( grenade ) && isalive( grenade ) )
  2009. {
  2010. grenade.team = self.team;
  2011. }
  2012. }
  2013. }
  2014.  
  2015. player_prevent_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
  2016. {
  2017. if ( eInflictor == self || eAttacker == self )
  2018. {
  2019. return false;
  2020. }
  2021.  
  2022. if ( isdefined( eInflictor ) && isdefined( eInflictor.team ) )
  2023. {
  2024. if ( eInflictor.team == self.team )
  2025. {
  2026. return true;
  2027. }
  2028. }
  2029.  
  2030. return false;
  2031. }
  2032.  
  2033. //
  2034. // Keep track of players going down and getting revived
  2035. player_revive_monitor()
  2036. {
  2037. self endon( "disconnect" );
  2038.  
  2039. while (1)
  2040. {
  2041. self waittill( "player_revived", reviver );
  2042.  
  2043. //AYERS: Working on Laststand Audio
  2044. //self clientnotify( "revived" );
  2045.  
  2046. bbPrint( "zombie_playerdeaths: round %d playername %s deathtype revived x %f y %f z %f", level.round_number, self.playername, self.origin );
  2047.  
  2048. //self laststand_giveback_player_perks();
  2049.  
  2050. if ( IsDefined(reviver) )
  2051. {
  2052. self maps\_zombiemode_audio::create_and_play_dialog( "general", "revive_up" );
  2053.  
  2054. //reviver maps\_zombiemode_rank::giveRankXp( "revive" );
  2055. //maps\_zombiemode_challenges::doMissionCallback( "zm_revive", reviver );
  2056.  
  2057. // Check to see how much money you lost from being down.
  2058. points = self.score_lost_when_downed;
  2059. reviver maps\_zombiemode_score::player_add_points( "reviver", points );
  2060. self.score_lost_when_downed = 0;
  2061. }
  2062. }
  2063. }
  2064.  
  2065.  
  2066. // self = a player
  2067. // If the player has just 1 perk, they wil always get it back
  2068. // If the player has more than 1 perk, they will lose a single perk
  2069. laststand_giveback_player_perks()
  2070. {
  2071. if ( IsDefined( self.laststand_perks ) )
  2072. {
  2073. // Calculate a lost perk index
  2074. lost_perk_index = int( -1 );
  2075. if( self.laststand_perks.size > 1 )
  2076. {
  2077. lost_perk_index = RandomInt( self.laststand_perks.size-1 );
  2078. }
  2079.  
  2080. // Give the player back their perks
  2081. for ( i=0; i<self.laststand_perks.size; i++ )
  2082. {
  2083. if ( self HasPerk( self.laststand_perks[i] ) )
  2084. {
  2085. continue;
  2086. }
  2087. if( i == lost_perk_index )
  2088. {
  2089. continue;
  2090. }
  2091.  
  2092. maps\_zombiemode_perks::give_perk( self.laststand_perks[i] );
  2093. }
  2094. }
  2095. }
  2096.  
  2097. remote_revive_watch()
  2098. {
  2099. self endon( "death" );
  2100. self endon( "player_revived" );
  2101.  
  2102. self waittill( "remote_revive", reviver );
  2103.  
  2104. self maps\_laststand::remote_revive( reviver );
  2105. }
  2106.  
  2107. remove_deadshot_bottle()
  2108. {
  2109. wait( 0.05 );
  2110.  
  2111. if ( isdefined( self.lastActiveWeapon ) && self.lastActiveWeapon == "zombie_perk_bottle_deadshot" )
  2112. {
  2113. self.lastActiveWeapon = "none";
  2114. }
  2115. }
  2116.  
  2117. take_additionalprimaryweapon()
  2118. {
  2119. weapon_to_take = undefined;
  2120.  
  2121. if ( is_true( self._retain_perks ) )
  2122. {
  2123. return weapon_to_take;
  2124. }
  2125.  
  2126. primary_weapons_that_can_be_taken = [];
  2127.  
  2128. primaryWeapons = self GetWeaponsListPrimaries();
  2129. for ( i = 0; i < primaryWeapons.size; i++ )
  2130. {
  2131. if ( maps\_zombiemode_weapons::is_weapon_included( primaryWeapons[i] ) || maps\_zombiemode_weapons::is_weapon_upgraded( primaryWeapons[i] ) )
  2132. {
  2133. primary_weapons_that_can_be_taken[primary_weapons_that_can_be_taken.size] = primaryWeapons[i];
  2134. }
  2135. }
  2136.  
  2137. if ( primary_weapons_that_can_be_taken.size >= 3 )
  2138. {
  2139. weapon_to_take = primary_weapons_that_can_be_taken[primary_weapons_that_can_be_taken.size - 1];
  2140. if ( weapon_to_take == self GetCurrentWeapon() )
  2141. {
  2142. self SwitchToWeapon( primary_weapons_that_can_be_taken[0] );
  2143. }
  2144. self TakeWeapon( weapon_to_take );
  2145. }
  2146.  
  2147. return weapon_to_take;
  2148. }
  2149.  
  2150. player_laststand( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
  2151. {
  2152. // Grab the perks, we'll give them back to the player if he's revived
  2153. //self.laststand_perks = maps\_zombiekmode_deathcard::deathcard_save_perks( self );
  2154.  
  2155. if ( self HasPerk( "specialty_additionalprimaryweapon" ) )
  2156. {
  2157. self.weapon_taken_by_losing_specialty_additionalprimaryweapon = self take_additionalprimaryweapon();
  2158. }
  2159.  
  2160. //AYERS: Working on Laststand Audio
  2161. /*
  2162. players = get_players();
  2163. if( players.size >= 2 )
  2164. {
  2165. self clientnotify( "lststnd" );
  2166. }
  2167. */
  2168.  
  2169. //if ( IsDefined( level.deathcard_laststand_func ) )
  2170. //{
  2171. // self [[ level.deathcard_laststand_func ]]();
  2172. //}
  2173. self clear_is_drinking();
  2174.  
  2175. self thread remove_deadshot_bottle();
  2176.  
  2177. self thread remote_revive_watch();
  2178.  
  2179. self maps\_zombiemode_score::player_downed_penalty();
  2180.  
  2181. // Turns out we need to do this after all, but we don't want to change _laststand.gsc postship, so I'm doing it here manually instead
  2182. self DisableOffhandWeapons();
  2183.  
  2184. self thread last_stand_grenade_save_and_return();
  2185.  
  2186. if( sMeansOfDeath != "MOD_SUICIDE" && sMeansOfDeath != "MOD_FALLING" )
  2187. {
  2188. self maps\_zombiemode_audio::create_and_play_dialog( "general", "revive_down" );
  2189. }
  2190.  
  2191. bbPrint( "zombie_playerdeaths: round %d playername %s deathtype downed x %f y %f z %f", level.round_number, self.playername, self.origin );
  2192.  
  2193. if( IsDefined( level._zombie_minigun_powerup_last_stand_func ) )
  2194. {
  2195. self thread [[level._zombie_minigun_powerup_last_stand_func]]();
  2196. }
  2197.  
  2198. if( IsDefined( level._zombie_tesla_powerup_last_stand_func ) )
  2199. {
  2200. self thread [[level._zombie_tesla_powerup_last_stand_func]]();
  2201. }
  2202.  
  2203. if( IsDefined( self.intermission ) && self.intermission )
  2204. {
  2205. //maps\_zombiemode_challenges::doMissionCallback( "playerDied", self );
  2206.  
  2207. bbPrint( "zombie_playerdeaths: round %d playername %s deathtype died x %f y %f z %f", level.round_number, self.playername, self.origin );
  2208.  
  2209. level waittill( "forever" );
  2210. }
  2211. }
  2212.  
  2213.  
  2214. failsafe_revive_give_back_weapons()
  2215. {
  2216. for ( i = 0; i < 10; i++ )
  2217. {
  2218. wait( 0.05 );
  2219.  
  2220. if ( !isdefined( self.reviveProgressBar ) )
  2221. {
  2222. continue;
  2223. }
  2224.  
  2225. players = get_players();
  2226. for ( playerIndex = 0; playerIndex < players.size; playerIndex++ )
  2227. {
  2228. revivee = players[playerIndex];
  2229.  
  2230. if ( self maps\_laststand::is_reviving( revivee ) )
  2231. {
  2232. // don't clean up revive stuff if he is reviving someone else
  2233. continue;
  2234. }
  2235. }
  2236.  
  2237. // he's not reviving anyone but he still has revive stuff up, clean it all up
  2238. /#
  2239. iprintlnbold( "FAILSAFE CLEANING UP REVIVE HUD AND GUN" );
  2240. #/
  2241. // pass in "none" since we have no idea what the weapon they should be showing is
  2242. self maps\_laststand::revive_give_back_weapons( "none" );
  2243.  
  2244. if ( isdefined( self.reviveProgressBar ) )
  2245. {
  2246. self.reviveProgressBar maps\_hud_util::destroyElem();
  2247. }
  2248.  
  2249. if ( isdefined( self.reviveTextHud ) )
  2250. {
  2251. self.reviveTextHud destroy();
  2252. }
  2253.  
  2254. return;
  2255. }
  2256. }
  2257.  
  2258.  
  2259. spawnSpectator()
  2260. {
  2261. self endon( "disconnect" );
  2262. self endon( "spawned_spectator" );
  2263. self notify( "spawned" );
  2264. self notify( "end_respawn" );
  2265.  
  2266. if( level.intermission )
  2267. {
  2268. return;
  2269. }
  2270.  
  2271. if( IsDefined( level.no_spectator ) && level.no_spectator )
  2272. {
  2273. wait( 3 );
  2274. ExitLevel();
  2275. }
  2276.  
  2277. // The check_for_level_end looks for this
  2278. self.is_zombie = true;
  2279.  
  2280. //failsafe against losing viewarms due to the thread returning them getting an endon from "zombified"
  2281. players = get_players();
  2282. for ( i = 0; i < players.size; i++ )
  2283. {
  2284. if ( self != players[i] )
  2285. {
  2286. players[i] thread failsafe_revive_give_back_weapons();
  2287. }
  2288. }
  2289.  
  2290. // Remove all reviving abilities
  2291. self notify ( "zombified" );
  2292.  
  2293. if( IsDefined( self.revivetrigger ) )
  2294. {
  2295. self.revivetrigger delete();
  2296. self.revivetrigger = undefined;
  2297. }
  2298.  
  2299. self.zombification_time = GetTime(); //set time when player died
  2300.  
  2301. resetTimeout();
  2302.  
  2303. // Stop shellshock and rumble
  2304. self StopShellshock();
  2305. self StopRumble( "damage_heavy" );
  2306.  
  2307. self.sessionstate = "spectator";
  2308. self.spectatorclient = -1;
  2309.  
  2310. self remove_from_spectate_list();
  2311.  
  2312. self.maxhealth = self.health;
  2313. self.shellshocked = false;
  2314. self.inWater = false;
  2315. self.friendlydamage = undefined;
  2316. self.hasSpawned = true;
  2317. self.spawnTime = GetTime();
  2318. self.afk = false;
  2319.  
  2320. println( "*************************Zombie Spectator***" );
  2321. self detachAll();
  2322.  
  2323. self setSpectatePermissions( true );
  2324. self thread spectator_thread();
  2325.  
  2326. self Spawn( self.origin, self.angles );
  2327. self notify( "spawned_spectator" );
  2328. }
  2329.  
  2330. setSpectatePermissions( isOn )
  2331. {
  2332. self AllowSpectateTeam( "allies", isOn );
  2333. self AllowSpectateTeam( "axis", false );
  2334. self AllowSpectateTeam( "freelook", false );
  2335. self AllowSpectateTeam( "none", false );
  2336. }
  2337.  
  2338. spectator_thread()
  2339. {
  2340. self endon( "disconnect" );
  2341. self endon( "spawned_player" );
  2342.  
  2343. /* we are not currently supporting the shared screen tech
  2344. if( IsSplitScreen() )
  2345. {
  2346. last_alive = undefined;
  2347. players = get_players();
  2348.  
  2349. for( i = 0; i < players.size; i++ )
  2350. {
  2351. if( !players[i].is_zombie )
  2352. {
  2353. last_alive = players[i];
  2354. }
  2355. }
  2356.  
  2357. share_screen( last_alive, true );
  2358.  
  2359. return;
  2360. }
  2361. */
  2362.  
  2363. // self thread spectator_toggle_3rd_person();
  2364. }
  2365.  
  2366. spectator_toggle_3rd_person()
  2367. {
  2368. self endon( "disconnect" );
  2369. self endon( "spawned_player" );
  2370.  
  2371. third_person = true;
  2372. self set_third_person( true );
  2373. // self NotifyOnCommand( "toggle_3rd_person", "weapnext" );
  2374.  
  2375. // while( 1 )
  2376. // {
  2377. // self waittill( "toggle_3rd_person" );
  2378. //
  2379. // if( third_person )
  2380. // {
  2381. // third_person = false;
  2382. // self set_third_person( false );
  2383. // wait( 0.5 );
  2384. // }
  2385. // else
  2386. // {
  2387. // third_person = true;
  2388. // self set_third_person( true );
  2389. // wait( 0.5 );
  2390. // }
  2391. // }
  2392. }
  2393.  
  2394.  
  2395. set_third_person( value )
  2396. {
  2397. if( value )
  2398. {
  2399. self SetClientDvars( "cg_thirdPerson", "1",
  2400. "cg_fov", "40",
  2401. "cg_thirdPersonAngle", "354" );
  2402.  
  2403. self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 );
  2404. }
  2405. else
  2406. {
  2407. self SetClientDvars( "cg_thirdPerson", "0",
  2408. "cg_fov", "65",
  2409. "cg_thirdPersonAngle", "0" );
  2410.  
  2411. self setDepthOfField( 0, 0, 512, 4000, 4, 0 );
  2412. }
  2413. }
  2414.  
  2415. last_stand_revive()
  2416. {
  2417. level endon( "between_round_over" );
  2418.  
  2419. players = getplayers();
  2420.  
  2421. for ( i = 0; i < players.size; i++ )
  2422. {
  2423. if ( players[i] maps\_laststand::player_is_in_laststand() && players[i].revivetrigger.beingRevived == 0 )
  2424. {
  2425. players[i] maps\_laststand::auto_revive();
  2426. }
  2427. }
  2428. }
  2429.  
  2430. // ww: arrange the last stand pistols so when it come time to choose which one they are inited
  2431. last_stand_pistol_rank_init()
  2432. {
  2433. level.pistol_values = [];
  2434.  
  2435. flag_wait( "_start_zm_pistol_rank" );
  2436.  
  2437. if( flag( "solo_game" ) )
  2438. {
  2439. // ww: in a solo game the ranking of the pistols is a bit different based on the upgraded 1911 swap
  2440. // any pistol ranked 4 or lower will be ignored and the player will be given the upgraded 1911
  2441. level.pistol_values[ level.pistol_values.size ] = "m1911_zm";
  2442. level.pistol_values[ level.pistol_values.size ] = "cz75_zm";
  2443. level.pistol_values[ level.pistol_values.size ] = "cz75dw_zm";
  2444. level.pistol_values[ level.pistol_values.size ] = "python_zm";
  2445. level.pistol_values[ level.pistol_values.size ] = "python_upgraded_zm"; // ww: this is spot 4, anything scoring lower than this should be replaced
  2446. level.pistol_values[ level.pistol_values.size ] = "cz75_upgraded_zm";
  2447. level.pistol_values[ level.pistol_values.size ] = "cz75dw_upgraded_zm";
  2448. level.pistol_values[ level.pistol_values.size ] = "m1911_upgraded_zm";
  2449. level.pistol_values[ level.pistol_values.size ] = "ray_gun_zm";
  2450. level.pistol_values[ level.pistol_values.size ] = "freezegun_zm";
  2451. level.pistol_values[ level.pistol_values.size ] = "ray_gun_upgraded_zm";
  2452. level.pistol_values[ level.pistol_values.size ] = "freezegun_upgraded_zm";
  2453. level.pistol_values[ level.pistol_values.size ] = "microwavegundw_zm";
  2454. level.pistol_values[ level.pistol_values.size ] = "microwavegundw_upgraded_zm";
  2455. }
  2456. else
  2457. {
  2458. level.pistol_values[ level.pistol_values.size ] = "m1911_zm";
  2459. level.pistol_values[ level.pistol_values.size ] = "cz75_zm";
  2460. level.pistol_values[ level.pistol_values.size ] = "cz75dw_zm";
  2461. level.pistol_values[ level.pistol_values.size ] = "python_zm";
  2462. level.pistol_values[ level.pistol_values.size ] = "python_upgraded_zm";
  2463. level.pistol_values[ level.pistol_values.size ] = "cz75_upgraded_zm";
  2464. level.pistol_values[ level.pistol_values.size ] = "cz75dw_upgraded_zm";
  2465. level.pistol_values[ level.pistol_values.size ] = "m1911_upgraded_zm";
  2466. level.pistol_values[ level.pistol_values.size ] = "ray_gun_zm";
  2467. level.pistol_values[ level.pistol_values.size ] = "freezegun_zm";
  2468. level.pistol_values[ level.pistol_values.size ] = "ray_gun_upgraded_zm";
  2469. level.pistol_values[ level.pistol_values.size ] = "freezegun_upgraded_zm";
  2470. level.pistol_values[ level.pistol_values.size ] = "microwavegundw_zm";
  2471. level.pistol_values[ level.pistol_values.size ] = "microwavegundw_upgraded_zm";
  2472. }
  2473.  
  2474. }
  2475.  
  2476. // ww: changing the _laststand scripts to this one so we interfere with SP less
  2477. last_stand_pistol_swap()
  2478. {
  2479. if ( self has_powerup_weapon() )
  2480. {
  2481. // this will force the laststand module to switch us to any primary weapon, since we will no longer have this after revive
  2482. self.lastActiveWeapon = "none";
  2483. }
  2484.  
  2485. if ( !self HasWeapon( self.laststandpistol ) )
  2486. {
  2487. self GiveWeapon( self.laststandpistol );
  2488. }
  2489. ammoclip = WeaponClipSize( self.laststandpistol );
  2490. doubleclip = ammoclip * 2;
  2491.  
  2492. if( is_true( self._special_solo_pistol_swap ) || (self.laststandpistol == "m1911_upgraded_zm" && !self.hadpistol) )
  2493. {
  2494. self._special_solo_pistol_swap = 0;
  2495. self.hadpistol = false;
  2496. self SetWeaponAmmoStock( self.laststandpistol, doubleclip );
  2497. }
  2498. else if( flag("solo_game") && self.laststandpistol == "m1911_upgraded_zm")
  2499. {
  2500. self SetWeaponAmmoStock( self.laststandpistol, doubleclip );
  2501. }
  2502. else if ( self.laststandpistol == "m1911_zm" )
  2503. {
  2504. self SetWeaponAmmoStock( self.laststandpistol, doubleclip );
  2505. }
  2506. else if ( self.laststandpistol == "ray_gun_zm" || self.laststandpistol == "ray_gun_upgraded_zm" )
  2507. {
  2508. if ( self.stored_weapon_info[ self.laststandpistol ].total_amt >= ammoclip )
  2509. {
  2510. self SetWeaponAmmoClip( self.laststandpistol, ammoclip );
  2511. self.stored_weapon_info[ self.laststandpistol ].given_amt = ammoclip;
  2512. }
  2513. else
  2514. {
  2515. self SetWeaponAmmoClip( self.laststandpistol, self.stored_weapon_info[ self.laststandpistol ].total_amt );
  2516. self.stored_weapon_info[ self.laststandpistol ].given_amt = self.stored_weapon_info[ self.laststandpistol ].total_amt;
  2517. }
  2518. self SetWeaponAmmoStock( self.laststandpistol, 0 );
  2519. }
  2520. else
  2521. {
  2522. if ( self.stored_weapon_info[ self.laststandpistol ].stock_amt >= doubleclip )
  2523. {
  2524. self SetWeaponAmmoStock( self.laststandpistol, doubleclip );
  2525. self.stored_weapon_info[ self.laststandpistol ].given_amt = doubleclip + self.stored_weapon_info[ self.laststandpistol ].clip_amt + self.stored_weapon_info[ self.laststandpistol ].left_clip_amt;
  2526. }
  2527. else
  2528. {
  2529. self SetWeaponAmmoStock( self.laststandpistol, self.stored_weapon_info[ self.laststandpistol ].stock_amt );
  2530. self.stored_weapon_info[ self.laststandpistol ].given_amt = self.stored_weapon_info[ self.laststandpistol ].total_amt;
  2531. }
  2532. }
  2533.  
  2534. self SwitchToWeapon( self.laststandpistol );
  2535. }
  2536.  
  2537. // ww: make sure the player has the best pistol when they go in to last stand
  2538. last_stand_best_pistol()
  2539. {
  2540. pistol_array = [];
  2541.  
  2542. current_weapons = self GetWeaponsListPrimaries();
  2543.  
  2544. for( i = 0; i < current_weapons.size; i++ )
  2545. {
  2546. // make sure the weapon is a pistol
  2547. if( WeaponClass( current_weapons[i] ) == "pistol" )
  2548. {
  2549. if ( (current_weapons[i] != "m1911_zm" && !flag("solo_game") ) || (!flag("solo_game") && current_weapons[i] != "m1911_upgraded_zm" ))
  2550. {
  2551.  
  2552. if ( self GetAmmoCount( current_weapons[i] ) <= 0 )
  2553. {
  2554. continue;
  2555. }
  2556. }
  2557.  
  2558. pistol_array_index = pistol_array.size; // set up the spot in the array
  2559. pistol_array[ pistol_array_index ] = SpawnStruct(); // struct to store info on
  2560.  
  2561. pistol_array[ pistol_array_index ].gun = current_weapons[i];
  2562. pistol_array[ pistol_array_index ].value = 0; // add a value in case a new weapon is introduced that hasn't been set up in level.pistol_values
  2563.  
  2564. // compare the current weapon to the level.pistol_values to see what the value is
  2565. for( j = 0; j < level.pistol_values.size; j++ )
  2566. {
  2567. if( level.pistol_values[j] == current_weapons[i] )
  2568. {
  2569. pistol_array[ pistol_array_index ].value = j;
  2570. break;
  2571. }
  2572. }
  2573. }
  2574. }
  2575.  
  2576. self.laststandpistol = last_stand_compare_pistols( pistol_array );
  2577. }
  2578.  
  2579. // ww: compares the array passed in for the highest valued pistol
  2580. last_stand_compare_pistols( struct_array )
  2581. {
  2582. if( !IsArray( struct_array ) || struct_array.size <= 0 )
  2583. {
  2584. self.hadpistol = false;
  2585.  
  2586. //array will be empty if the pistol had no ammo...so lets see if the player had the pistol
  2587. if(isDefined(self.stored_weapon_info))
  2588. {
  2589. stored_weapon_info = GetArrayKeys( self.stored_weapon_info );
  2590. for( j = 0; j < stored_weapon_info.size; j++ )
  2591. {
  2592. if( stored_weapon_info[ j ] == level.laststandpistol)
  2593. {
  2594. self.hadpistol = true;
  2595. }
  2596. }
  2597. }
  2598.  
  2599. return level.laststandpistol; // nothing in the array then give the level last stand pistol
  2600. }
  2601.  
  2602. highest_score_pistol = struct_array[0]; // first time through give the first one to the highest score
  2603.  
  2604. for( i = 1; i < struct_array.size; i++ )
  2605. {
  2606. if( struct_array[i].value > highest_score_pistol.value )
  2607. {
  2608. highest_score_pistol = struct_array[i];
  2609. }
  2610. }
  2611.  
  2612. if( flag( "solo_game" ) )
  2613. {
  2614. self._special_solo_pistol_swap = 0; // ww: this way the weapon knows to pack texture when given
  2615. if( highest_score_pistol.value <= 4 )
  2616. {
  2617. self.hadpistol = false;
  2618. self._special_solo_pistol_swap = 1;
  2619. return level.laststandpistol; // ww: if it scores too low the player gets the 1911 upgraded
  2620. }
  2621. else
  2622. {
  2623. return highest_score_pistol.gun; // ww: gun is high in ranking and won't be replaced
  2624. }
  2625. }
  2626. else // ww: happens when not in solo
  2627. {
  2628. return highest_score_pistol.gun;
  2629. }
  2630.  
  2631. }
  2632.  
  2633. // ww: override function for saving player pistol ammo count
  2634. last_stand_save_pistol_ammo()
  2635. {
  2636. weapon_inventory = self GetWeaponsList();
  2637. self.stored_weapon_info = [];
  2638.  
  2639. for( i = 0; i < weapon_inventory.size; i++ )
  2640. {
  2641. weapon = weapon_inventory[i];
  2642.  
  2643. if ( WeaponClass( weapon ) == "pistol" )
  2644. {
  2645. self.stored_weapon_info[ weapon ] = SpawnStruct();
  2646. self.stored_weapon_info[ weapon ].clip_amt = self GetWeaponAmmoClip( weapon );
  2647. self.stored_weapon_info[ weapon ].left_clip_amt = 0;
  2648. dual_wield_name = WeaponDualWieldWeaponName( weapon );
  2649. if ( "none" != dual_wield_name )
  2650. {
  2651. self.stored_weapon_info[ weapon ].left_clip_amt = self GetWeaponAmmoClip( dual_wield_name );
  2652. }
  2653. self.stored_weapon_info[ weapon ].stock_amt = self GetWeaponAmmoStock( weapon );
  2654. self.stored_weapon_info[ weapon ].total_amt = self.stored_weapon_info[ weapon ].clip_amt + self.stored_weapon_info[ weapon ].left_clip_amt + self.stored_weapon_info[ weapon ].stock_amt;
  2655. self.stored_weapon_info[ weapon ].given_amt = 0;
  2656. }
  2657. }
  2658.  
  2659. self last_stand_best_pistol();
  2660. }
  2661.  
  2662. // ww: override to restore the player's pistol ammo after being picked up
  2663. last_stand_restore_pistol_ammo()
  2664. {
  2665. self.weapon_taken_by_losing_specialty_additionalprimaryweapon = undefined;
  2666.  
  2667. if( !IsDefined( self.stored_weapon_info ) )
  2668. {
  2669. return;
  2670. }
  2671.  
  2672. weapon_inventory = self GetWeaponsList();
  2673. weapon_to_restore = GetArrayKeys( self.stored_weapon_info );
  2674.  
  2675. for( i = 0; i < weapon_inventory.size; i++ )
  2676. {
  2677. weapon = weapon_inventory[i];
  2678.  
  2679. if ( weapon != self.laststandpistol )
  2680. {
  2681. continue;
  2682. }
  2683.  
  2684. for( j = 0; j < weapon_to_restore.size; j++ )
  2685. {
  2686. check_weapon = weapon_to_restore[j];
  2687.  
  2688. if( weapon == check_weapon )
  2689. {
  2690. dual_wield_name = WeaponDualWieldWeaponName( weapon_to_restore[j] );
  2691. if ( weapon != "m1911_zm" )
  2692. {
  2693. last_clip = self GetWeaponAmmoClip( weapon );
  2694. last_left_clip = 0;
  2695. if ( "none" != dual_wield_name )
  2696. {
  2697. last_left_clip = self GetWeaponAmmoClip( dual_wield_name );
  2698. }
  2699. last_stock = self GetWeaponAmmoStock( weapon );
  2700. last_total = last_clip + last_left_clip + last_stock;
  2701.  
  2702. used_amt = self.stored_weapon_info[ weapon ].given_amt - last_total;
  2703.  
  2704. if ( used_amt >= self.stored_weapon_info[ weapon ].stock_amt )
  2705. {
  2706. used_amt -= self.stored_weapon_info[ weapon ].stock_amt;
  2707. self.stored_weapon_info[ weapon ].stock_amt = 0;
  2708.  
  2709. self.stored_weapon_info[ weapon ].clip_amt -= used_amt;
  2710. if ( self.stored_weapon_info[ weapon ].clip_amt < 0 )
  2711. {
  2712. self.stored_weapon_info[ weapon ].clip_amt = 0;
  2713. }
  2714. }
  2715. else
  2716. {
  2717. new_stock_amt = self.stored_weapon_info[ weapon ].stock_amt - used_amt;
  2718. if ( new_stock_amt < self.stored_weapon_info[ weapon ].stock_amt )
  2719. {
  2720. self.stored_weapon_info[ weapon ].stock_amt = new_stock_amt;
  2721. }
  2722. }
  2723. }
  2724.  
  2725. self SetWeaponAmmoClip( weapon_to_restore[j], self.stored_weapon_info[ weapon_to_restore[j] ].clip_amt );
  2726. if ( "none" != dual_wield_name )
  2727. {
  2728. self SetWeaponAmmoClip( dual_wield_name , self.stored_weapon_info[ weapon_to_restore[j] ].left_clip_amt );
  2729. }
  2730. self SetWeaponAmmoStock( weapon_to_restore[j], self.stored_weapon_info[ weapon_to_restore[j] ].stock_amt );
  2731. break;
  2732. }
  2733. }
  2734. }
  2735. }
  2736.  
  2737. // ww: changes the last stand pistol to the upgraded 1911s if it is solo
  2738. zombiemode_solo_last_stand_pistol()
  2739. {
  2740. level.laststandpistol = "m1911_upgraded_zm";
  2741. }
  2742.  
  2743. // ww: zeros out the player's grenades until they revive
  2744. last_stand_grenade_save_and_return()
  2745. {
  2746. self endon( "death" );
  2747.  
  2748. lethal_nade_amt = 0;
  2749. has_lethal_nade = false;
  2750. tactical_nade_amt = 0;
  2751. has_tactical_nade = false;
  2752.  
  2753. // figure out which nades this player has
  2754. weapons_on_player = self GetWeaponsList();
  2755. for ( i = 0; i < weapons_on_player.size; i++ )
  2756. {
  2757. if ( self is_player_lethal_grenade( weapons_on_player[i] ) )
  2758. {
  2759. has_lethal_nade = true;
  2760. lethal_nade_amt = self GetWeaponAmmoClip( self get_player_lethal_grenade() );
  2761. self SetWeaponAmmoClip( self get_player_lethal_grenade(), 0 );
  2762. self TakeWeapon( self get_player_lethal_grenade() );
  2763. }
  2764. else if ( self is_player_tactical_grenade( weapons_on_player[i] ) )
  2765. {
  2766. has_tactical_nade = true;
  2767. tactical_nade_amt = self GetWeaponAmmoClip( self get_player_tactical_grenade() );
  2768. self SetWeaponAmmoClip( self get_player_tactical_grenade(), 0 );
  2769. self TakeWeapon( self get_player_tactical_grenade() );
  2770. }
  2771. }
  2772.  
  2773. self waittill( "player_revived" );
  2774.  
  2775. if ( has_lethal_nade )
  2776. {
  2777. self GiveWeapon( self get_player_lethal_grenade() );
  2778. self SetWeaponAmmoClip( self get_player_lethal_grenade(), lethal_nade_amt );
  2779. }
  2780.  
  2781. if ( has_tactical_nade )
  2782. {
  2783. self GiveWeapon( self get_player_tactical_grenade() );
  2784. self SetWeaponAmmoClip( self get_player_tactical_grenade(), tactical_nade_amt );
  2785. }
  2786. }
  2787.  
  2788. spectators_respawn()
  2789. {
  2790. level endon( "between_round_over" );
  2791.  
  2792. if( !IsDefined( level.zombie_vars["spectators_respawn"] ) || !level.zombie_vars["spectators_respawn"] )
  2793. {
  2794. return;
  2795. }
  2796.  
  2797. if( !IsDefined( level.custom_spawnPlayer ) )
  2798. {
  2799. // Custom spawn call for when they respawn from spectator
  2800. level.custom_spawnPlayer = ::spectator_respawn;
  2801. }
  2802.  
  2803. while( 1 )
  2804. {
  2805. players = get_players();
  2806. for( i = 0; i < players.size; i++ )
  2807. {
  2808. if( players[i].sessionstate == "spectator" )
  2809. {
  2810. players[i] [[level.spawnPlayer]]();
  2811. if (isDefined(level.script) && level.round_number > 6 && players[i].score < 1500)
  2812. {
  2813. players[i].old_score = players[i].score;
  2814. players[i].score = 1500;
  2815. players[i] maps\_zombiemode_score::set_player_score_hud();
  2816. }
  2817. }
  2818. }
  2819.  
  2820. wait( 1 );
  2821. }
  2822. }
  2823.  
  2824. spectator_respawn()
  2825. {
  2826. println( "*************************Respawn Spectator***" );
  2827. assert( IsDefined( self.spectator_respawn ) );
  2828.  
  2829. origin = self.spectator_respawn.origin;
  2830. angles = self.spectator_respawn.angles;
  2831.  
  2832. self setSpectatePermissions( false );
  2833.  
  2834. new_origin = undefined;
  2835.  
  2836. if ( isdefined( level.check_valid_spawn_override ) )
  2837. {
  2838. new_origin = [[ level.check_valid_spawn_override ]]( self );
  2839. }
  2840.  
  2841. if ( !isdefined( new_origin ) )
  2842. {
  2843. new_origin = check_for_valid_spawn_near_team( self );
  2844. }
  2845.  
  2846. if( IsDefined( new_origin ) )
  2847. {
  2848. self Spawn( new_origin, angles );
  2849. }
  2850. else
  2851. {
  2852. self Spawn( origin, angles );
  2853. }
  2854.  
  2855.  
  2856. /* we are not currently supporting the shared screen tech
  2857. if( IsSplitScreen() )
  2858. {
  2859. last_alive = undefined;
  2860. players = get_players();
  2861.  
  2862. for( i = 0; i < players.size; i++ )
  2863. {
  2864. if( !players[i].is_zombie )
  2865. {
  2866. last_alive = players[i];
  2867. }
  2868. }
  2869.  
  2870. share_screen( last_alive, false );
  2871. }
  2872. */
  2873.  
  2874. if ( IsDefined( self get_player_placeable_mine() ) )
  2875. {
  2876. self TakeWeapon( self get_player_placeable_mine() );
  2877. self set_player_placeable_mine( undefined );
  2878. }
  2879.  
  2880. self maps\_zombiemode_equipment::equipment_take();
  2881.  
  2882. self.is_burning = undefined;
  2883. self.abilities = [];
  2884.  
  2885. // The check_for_level_end looks for this
  2886. self.is_zombie = false;
  2887. self.ignoreme = false;
  2888.  
  2889. setClientSysState("lsm", "0", self); // Notify client last stand ended.
  2890. self RevivePlayer();
  2891.  
  2892. self notify( "spawned_player" );
  2893.  
  2894. if(IsDefined(level._zombiemode_post_respawn_callback))
  2895. {
  2896. self thread [[level._zombiemode_post_respawn_callback]]();
  2897. }
  2898.  
  2899. // Penalize the player when we respawn, since he 'died'
  2900. self maps\_zombiemode_score::player_reduce_points( "died" );
  2901.  
  2902. //DCS: make bowie & claymore trigger available again.
  2903. bowie_triggers = GetEntArray( "bowie_upgrade", "targetname" );
  2904. // ww: player needs to reset trigger knowledge without claiming full ownership
  2905. self._bowie_zm_equipped = undefined;
  2906. players = get_players();
  2907. for( i = 0; i < bowie_triggers.size; i++ )
  2908. {
  2909. bowie_triggers[i] SetVisibleToAll();
  2910. // check the player to see if he has the bowie, if they do trigger goes invisible
  2911. for( j = 0; j < players.size; j++ )
  2912. {
  2913. if( IsDefined( players[j]._bowie_zm_equipped ) && players[j]._bowie_zm_equipped == 1 )
  2914. {
  2915. bowie_triggers[i] SetInvisibleToPlayer( players[j] );
  2916. }
  2917. }
  2918. }
  2919.  
  2920. sickle_triggers = GetEntArray( "sickle_upgrade", "targetname" );
  2921. // ww: player needs to reset trigger knowledge without claiming full ownership
  2922. self._sickle_zm_equipped = undefined;
  2923. players = get_players();
  2924. for( i = 0; i < sickle_triggers.size; i++ )
  2925. {
  2926. sickle_triggers[i] SetVisibleToAll();
  2927. // check the player to see if he has the sickle, if they do trigger goes invisible
  2928. for( j = 0; j < players.size; j++ )
  2929. {
  2930. if( IsDefined( players[j]._sickle_zm_equipped ) && players[j]._sickle_zm_equipped == 1 )
  2931. {
  2932. sickle_triggers[i] SetInvisibleToPlayer( players[j] );
  2933. }
  2934. }
  2935. }
  2936.  
  2937. // ww: inside _zombiemode_claymore the claymore triggers are fixed for players who haven't bought them
  2938. // to see them after someone respawns from bleedout
  2939. // it isn't the best way to do it but it is late in the project and probably better if i don't modify it
  2940. // unless a bug comes through on it
  2941. claymore_triggers = getentarray("claymore_purchase","targetname");
  2942. for(i = 0; i < claymore_triggers.size; i++)
  2943. {
  2944. claymore_triggers[i] SetVisibleToPlayer(self);
  2945. claymore_triggers[i].claymores_triggered = false;
  2946. }
  2947.  
  2948. self thread player_zombie_breadcrumb();
  2949.  
  2950. return true;
  2951. }
  2952.  
  2953. check_for_valid_spawn_near_team( revivee )
  2954. {
  2955.  
  2956. players = get_players();
  2957. spawn_points = getstructarray("player_respawn_point", "targetname");
  2958. closest_group = undefined;
  2959. closest_distance = 100000000;
  2960. backup_group = undefined;
  2961. backup_distance = 100000000;
  2962.  
  2963. if( spawn_points.size == 0 )
  2964. return undefined;
  2965.  
  2966. // Look for the closest group that is within the specified ideal distances
  2967. // If we can't find one within a valid area, use the closest unlocked group.
  2968. for( i = 0; i < players.size; i++ )
  2969. {
  2970. if( is_player_valid( players[i] ) )
  2971. {
  2972. for( j = 0 ; j < spawn_points.size; j++ )
  2973. {
  2974. if( isdefined(spawn_points[i].script_int) )
  2975. ideal_distance = spawn_points[i].script_int;
  2976. else
  2977. ideal_distance = 1000;
  2978.  
  2979. if ( spawn_points[j].locked == false )
  2980. {
  2981. distance = DistanceSquared( players[i].origin, spawn_points[j].origin );
  2982. if( distance < ( ideal_distance * ideal_distance ) )
  2983. {
  2984. if ( distance < closest_distance )
  2985. {
  2986. closest_distance = distance;
  2987. closest_group = j;
  2988. }
  2989. }
  2990. else
  2991. {
  2992. if ( distance < backup_distance )
  2993. {
  2994. backup_group = j;
  2995. backup_distance = distance;
  2996. }
  2997. }
  2998. }
  2999. }
  3000. }
  3001. // If we don't have a closest_group, let's use the backup
  3002. if ( !IsDefined( closest_group ) )
  3003. {
  3004. closest_group = backup_group;
  3005. }
  3006.  
  3007. if ( IsDefined( closest_group ) )
  3008. {
  3009. spawn_array = getstructarray( spawn_points[closest_group].target, "targetname" );
  3010.  
  3011. for( k = 0; k < spawn_array.size; k++ )
  3012. {
  3013. if( spawn_array[k].script_int == (revivee.entity_num + 1) )
  3014. {
  3015. return spawn_array[k].origin;
  3016. }
  3017. }
  3018.  
  3019. return spawn_array[0].origin;
  3020. }
  3021. }
  3022.  
  3023. return undefined;
  3024.  
  3025. }
  3026.  
  3027.  
  3028. get_players_on_team(exclude)
  3029. {
  3030.  
  3031. teammates = [];
  3032.  
  3033. players = get_players();
  3034. for(i=0;i<players.size;i++)
  3035. {
  3036. //check to see if other players on your team are alive and not waiting to be revived
  3037. if(players[i].spawn_side == self.spawn_side && !isDefined(players[i].revivetrigger) && players[i] != exclude )
  3038. {
  3039. teammates[teammates.size] = players[i];
  3040. }
  3041. }
  3042.  
  3043. return teammates;
  3044. }
  3045.  
  3046.  
  3047.  
  3048. get_safe_breadcrumb_pos( player )
  3049. {
  3050. players = get_players();
  3051. valid_players = [];
  3052.  
  3053. min_dist = 150 * 150;
  3054. for( i = 0; i < players.size; i++ )
  3055. {
  3056. if( !is_player_valid( players[i] ) )
  3057. {
  3058. continue;
  3059. }
  3060.  
  3061. valid_players[valid_players.size] = players[i];
  3062. }
  3063.  
  3064. for( i = 0; i < valid_players.size; i++ )
  3065. {
  3066. count = 0;
  3067. for( q = 1; q < player.zombie_breadcrumbs.size; q++ )
  3068. {
  3069. if( DistanceSquared( player.zombie_breadcrumbs[q], valid_players[i].origin ) < min_dist )
  3070. {
  3071. continue;
  3072. }
  3073.  
  3074. count++;
  3075. if( count == valid_players.size )
  3076. {
  3077. return player.zombie_breadcrumbs[q];
  3078. }
  3079. }
  3080. }
  3081.  
  3082. return undefined;
  3083. }
  3084.  
  3085. default_max_zombie_func( max_num )
  3086. {
  3087. max = max_num;
  3088.  
  3089. if ( level.first_round )
  3090. {
  3091. max = int( max_num * 0.25 );
  3092. }
  3093. else if (level.round_number < 3)
  3094. {
  3095. max = int( max_num * 0.3 );
  3096. }
  3097. else if (level.round_number < 4)
  3098. {
  3099. max = int( max_num * 0.5 );
  3100. }
  3101. else if (level.round_number < 5)
  3102. {
  3103. max = int( max_num * 0.7 );
  3104. }
  3105. else if (level.round_number < 6)
  3106. {
  3107. max = int( max_num * 0.9 );
  3108. }
  3109.  
  3110. return max;
  3111. }
  3112.  
  3113. round_spawning()
  3114. {
  3115. level endon( "intermission" );
  3116. level endon( "end_of_round" );
  3117. level endon( "restart_round" );
  3118. /#
  3119. level endon( "kill_round" );
  3120. #/
  3121.  
  3122. if( level.intermission )
  3123. {
  3124. return;
  3125. }
  3126.  
  3127. if( level.enemy_spawns.size < 1 )
  3128. {
  3129. ASSERTMSG( "No active spawners in the map. Check to see if the zone is active and if it's pointing to spawners." );
  3130. return;
  3131. }
  3132.  
  3133. /#
  3134. if ( GetDvarInt( #"zombie_cheat" ) == 2 || GetDvarInt( #"zombie_cheat" ) >= 4 )
  3135. {
  3136. return;
  3137. }
  3138. #/
  3139.  
  3140. ai_calculate_health( level.round_number );
  3141.  
  3142. count = 0;
  3143.  
  3144. //CODER MOD: TOMMY K
  3145. players = get_players();
  3146. for( i = 0; i < players.size; i++ )
  3147. {
  3148. players[i].zombification_time = 0;
  3149. }
  3150.  
  3151. max = level.zombie_vars["zombie_max_ai"];
  3152.  
  3153. multiplier = level.round_number / 5;
  3154. if( multiplier < 1 )
  3155. {
  3156. multiplier = 1;
  3157. }
  3158.  
  3159. // After round 10, exponentially have more AI attack the player
  3160. if( level.round_number >= 10 )
  3161. {
  3162. multiplier *= level.round_number * 0.15;
  3163. }
  3164.  
  3165. player_num = get_players().size;
  3166.  
  3167. if( player_num == 1 )
  3168. {
  3169. max += int( ( 0.5 * level.zombie_vars["zombie_ai_per_player"] ) * multiplier );
  3170. }
  3171. else
  3172. {
  3173. max += int( ( ( player_num - 1 ) * level.zombie_vars["zombie_ai_per_player"] ) * multiplier );
  3174. }
  3175.  
  3176. if( !isDefined( level.max_zombie_func ) )
  3177. {
  3178. level.max_zombie_func = ::default_max_zombie_func;
  3179. }
  3180.  
  3181. // Now set the total for the new round, except when it's already been set by the
  3182. // kill counter.
  3183. if ( !(IsDefined( level.kill_counter_hud ) && level.zombie_total > 0) )
  3184. {
  3185. level.zombie_total = [[ level.max_zombie_func ]]( max );
  3186. }
  3187.  
  3188. if ( IsDefined( level.zombie_total_set_func ) )
  3189. {
  3190. level thread [[ level.zombie_total_set_func ]]();
  3191. }
  3192.  
  3193. if ( level.round_number < 10 )
  3194. {
  3195. level thread zombie_speed_up();
  3196. }
  3197.  
  3198. mixed_spawns = 0; // Number of mixed spawns this round. Currently means number of dogs in a mixed round
  3199.  
  3200. // DEBUG HACK:
  3201. //max = 1;
  3202. old_spawn = undefined;
  3203. // while( level.zombie_total > 0 )
  3204. while( 1 )
  3205. {
  3206. while( get_enemy_count() >= level.zombie_ai_limit || level.zombie_total <= 0 )
  3207. {
  3208. wait( 0.1 );
  3209. }
  3210.  
  3211. // added ability to pause zombie spawning
  3212. if ( !flag("spawn_zombies" ) )
  3213. {
  3214. flag_wait( "spawn_zombies" );
  3215. }
  3216.  
  3217. spawn_point = level.enemy_spawns[RandomInt( level.enemy_spawns.size )];
  3218.  
  3219. if( !IsDefined( old_spawn ) )
  3220. {
  3221. old_spawn = spawn_point;
  3222. }
  3223. else if( Spawn_point == old_spawn )
  3224. {
  3225. spawn_point = level.enemy_spawns[RandomInt( level.enemy_spawns.size )];
  3226. }
  3227. old_spawn = spawn_point;
  3228.  
  3229. // iPrintLn(spawn_point.targetname + " " + level.zombie_vars["zombie_spawn_delay"]);
  3230.  
  3231. // MM Mix in dog spawns...
  3232. if ( IsDefined( level.mixed_rounds_enabled ) && level.mixed_rounds_enabled == 1 )
  3233. {
  3234. spawn_dog = false;
  3235. if ( level.round_number > 30 )
  3236. {
  3237. if ( RandomInt(100) < 3 )
  3238. {
  3239. spawn_dog = true;
  3240. }
  3241. }
  3242. else if ( level.round_number > 25 && mixed_spawns < 3 )
  3243. {
  3244. if ( RandomInt(100) < 2 )
  3245. {
  3246. spawn_dog = true;
  3247. }
  3248. }
  3249. else if ( level.round_number > 20 && mixed_spawns < 2 )
  3250. {
  3251. if ( RandomInt(100) < 2 )
  3252. {
  3253. spawn_dog = true;
  3254. }
  3255. }
  3256. else if ( level.round_number > 15 && mixed_spawns < 1 )
  3257. {
  3258. if ( RandomInt(100) < 1 )
  3259. {
  3260. spawn_dog = true;
  3261. }
  3262. }
  3263.  
  3264. if ( spawn_dog )
  3265. {
  3266. keys = GetArrayKeys( level.zones );
  3267. for ( i=0; i<keys.size; i++ )
  3268. {
  3269. if ( level.zones[ keys[i] ].is_occupied )
  3270. {
  3271. akeys = GetArrayKeys( level.zones[ keys[i] ].adjacent_zones );
  3272. for ( k=0; k<akeys.size; k++ )
  3273. {
  3274. if ( level.zones[ akeys[k] ].is_active &&
  3275. !level.zones[ akeys[k] ].is_occupied &&
  3276. level.zones[ akeys[k] ].dog_locations.size > 0 )
  3277. {
  3278. maps\_zombiemode_ai_dogs::special_dog_spawn( undefined, 1 );
  3279. level.zombie_total--;
  3280. wait_network_frame();
  3281. }
  3282. }
  3283. }
  3284. }
  3285. }
  3286. }
  3287.  
  3288. ai = spawn_zombie( spawn_point );
  3289. if( IsDefined( ai ) )
  3290. {
  3291. level.zombie_total--;
  3292. ai thread round_spawn_failsafe();
  3293. count++;
  3294. }
  3295.  
  3296. wait( level.zombie_vars["zombie_spawn_delay"] );
  3297. wait_network_frame();
  3298. }
  3299. }
  3300.  
  3301. //
  3302. // Make the last few zombies run
  3303. //
  3304. zombie_speed_up()
  3305. {
  3306. if( level.round_number <= 3 )
  3307. {
  3308. return;
  3309. }
  3310.  
  3311. level endon( "intermission" );
  3312. level endon( "end_of_round" );
  3313. level endon( "restart_round" );
  3314. /#
  3315. level endon( "kill_round" );
  3316. #/
  3317.  
  3318. // Wait until we've finished spawning
  3319. while ( level.zombie_total > 4 )
  3320. {
  3321. wait( 2.0 );
  3322. }
  3323.  
  3324. // Now wait for these guys to get whittled down
  3325. num_zombies = get_enemy_count();
  3326. while( num_zombies > 3 )
  3327. {
  3328. wait( 2.0 );
  3329.  
  3330. num_zombies = get_enemy_count();
  3331. }
  3332.  
  3333. zombies = GetAiSpeciesArray( "axis", "all" );
  3334. while( zombies.size > 0 )
  3335. {
  3336. if( zombies.size == 1 && zombies[0].has_legs == true )
  3337. {
  3338. if ( isdefined( level.zombie_speed_up ) )
  3339. {
  3340. zombies[0] thread [[ level.zombie_speed_up ]]();
  3341. break;
  3342. }
  3343. else
  3344. {
  3345. var = randomintrange(1, 4);
  3346. zombies[0] set_run_anim( "sprint" + var );
  3347. zombies[0].run_combatanim = level.scr_anim[zombies[0].animname]["sprint" + var];
  3348. }
  3349. }
  3350. wait(0.5);
  3351. zombies = GetAiSpeciesArray( "axis", "all" );
  3352. }
  3353. }
  3354.  
  3355. // TESTING: spawn one zombie at a time
  3356. round_spawning_test()
  3357. {
  3358. while (true)
  3359. {
  3360. spawn_point = level.enemy_spawns[RandomInt( level.enemy_spawns.size )]; // grab a random spawner
  3361.  
  3362. ai = spawn_zombie( spawn_point );
  3363. ai waittill("death");
  3364.  
  3365. wait 5;
  3366. }
  3367. }
  3368.  
  3369.  
  3370. /////////////////////////////////////////////////////////
  3371.  
  3372. // round_text( text )
  3373. // {
  3374. // if( level.first_round )
  3375. // {
  3376. // intro = true;
  3377. // }
  3378. // else
  3379. // {
  3380. // intro = false;
  3381. // }
  3382. //
  3383. // hud = create_simple_hud();
  3384. // hud.horzAlign = "center";
  3385. // hud.vertAlign = "middle";
  3386. // hud.alignX = "center";
  3387. // hud.alignY = "middle";
  3388. // hud.y = -100;
  3389. // hud.foreground = 1;
  3390. // hud.fontscale = 16.0;
  3391. // hud.alpha = 0;
  3392. // hud.color = ( 1, 1, 1 );
  3393. //
  3394. // hud SetText( text );
  3395. // hud FadeOverTime( 1.5 );
  3396. // hud.alpha = 1;
  3397. // wait( 1.5 );
  3398. //
  3399. // if( intro )
  3400. // {
  3401. // wait( 1 );
  3402. // level notify( "intro_change_color" );
  3403. // }
  3404. //
  3405. // hud FadeOverTime( 3 );
  3406. // //hud.color = ( 0.8, 0, 0 );
  3407. // hud.color = ( 0.21, 0, 0 );
  3408. // wait( 3 );
  3409. //
  3410. // if( intro )
  3411. // {
  3412. // level waittill( "intro_hud_done" );
  3413. // }
  3414. //
  3415. // hud FadeOverTime( 1.5 );
  3416. // hud.alpha = 0;
  3417. // wait( 1.5 );
  3418. // hud destroy();
  3419. // }
  3420.  
  3421.  
  3422. // Allows the round to be paused. Displays a countdown timer.
  3423. //
  3424. round_pause( delay )
  3425. {
  3426. if ( !IsDefined( delay ) )
  3427. {
  3428. delay = 30;
  3429. }
  3430.  
  3431. level.countdown_hud = create_counter_hud();
  3432. level.countdown_hud SetValue( delay );
  3433. level.countdown_hud.color = ( 1, 1, 1 );
  3434. level.countdown_hud.alpha = 1;
  3435. level.countdown_hud FadeOverTime( 2.0 );
  3436. wait( 2.0 );
  3437.  
  3438. level.countdown_hud.color = ( 0.21, 0, 0 );
  3439. level.countdown_hud FadeOverTime( 3.0 );
  3440. wait(3);
  3441.  
  3442. while (delay >= 1)
  3443. {
  3444. wait (1);
  3445. delay--;
  3446. level.countdown_hud SetValue( delay );
  3447. }
  3448.  
  3449. // Zero! Play end sound
  3450. players = GetPlayers();
  3451. for (i=0; i<players.size; i++ )
  3452. {
  3453. players[i] playlocalsound( "zmb_perks_packa_ready" );
  3454. }
  3455.  
  3456. level.countdown_hud FadeOverTime( 1.0 );
  3457. level.countdown_hud.color = (1,1,1);
  3458. level.countdown_hud.alpha = 0;
  3459. wait( 1.0 );
  3460.  
  3461. level.countdown_hud destroy_hud();
  3462. }
  3463.  
  3464.  
  3465. // Zombie spawning
  3466. //
  3467. round_start()
  3468. {
  3469. if ( IsDefined(level.round_prestart_func) )
  3470. {
  3471. [[ level.round_prestart_func ]]();
  3472. }
  3473. else
  3474. {
  3475. wait( 2 );
  3476. }
  3477.  
  3478. level.zombie_health = level.zombie_vars["zombie_health_start"];
  3479.  
  3480. // so players get init'ed with grenades
  3481. players = get_players();
  3482. for (i = 0; i < players.size; i++)
  3483. {
  3484. players[i] giveweapon( players[i] get_player_lethal_grenade() );
  3485. players[i] setweaponammoclip( players[i] get_player_lethal_grenade(), 0);
  3486. players[i] SetClientDvars( "ammoCounterHide", "0",
  3487. "miniscoreboardhide", "0" );
  3488. //players[i] thread maps\_zombiemode_ability::give_round1_abilities();
  3489. }
  3490.  
  3491. if( getDvarInt( #"scr_writeconfigstrings" ) == 1 )
  3492. {
  3493. wait(5);
  3494. ExitLevel();
  3495. return;
  3496. }
  3497. // if( isDefined(level.chests) && isDefined(level.chest_index) )
  3498. // {
  3499. // Objective_Add( 0, "active", "Mystery Box", level.chests[level.chest_index].chest_lid.origin, "minimap_icon_mystery_box" );
  3500. // }
  3501.  
  3502. if ( level.zombie_vars["game_start_delay"] > 0 )
  3503. {
  3504. round_pause( level.zombie_vars["game_start_delay"] );
  3505. }
  3506.  
  3507. flag_set( "begin_spawning" );
  3508.  
  3509. //maps\_zombiemode_solo::init();
  3510.  
  3511. level.chalk_hud1 = create_chalk_hud();
  3512. // if( level.round_number >= 1 && level.round_number <= 5 )
  3513. // {
  3514. // level.chalk_hud1 SetShader( "hud_chalk_" + level.round_number, 64, 64 );
  3515. // }
  3516. // else if ( level.round_number >= 5 && level.round_number <= 10 )
  3517. // {
  3518. // level.chalk_hud1 SetShader( "hud_chalk_5", 64, 64 );
  3519. // }
  3520. level.chalk_hud2 = create_chalk_hud( 64 );
  3521.  
  3522. // level waittill( "introscreen_done" );
  3523.  
  3524. if( !isDefined(level.round_spawn_func) )
  3525. {
  3526. level.round_spawn_func = ::round_spawning;
  3527. }
  3528. /#
  3529. if (GetDvarInt( #"zombie_rise_test") )
  3530. {
  3531. level.round_spawn_func = ::round_spawning_test; // FOR TESTING, one zombie at a time, no round advancement
  3532. }
  3533. #/
  3534.  
  3535. if ( !isDefined(level.round_wait_func) )
  3536. {
  3537. level.round_wait_func = ::round_wait;
  3538. }
  3539.  
  3540. if ( !IsDefined(level.round_think_func) )
  3541. {
  3542. level.round_think_func = ::round_think;
  3543. }
  3544.  
  3545. if( level.mutators["mutator_fogMatch"] )
  3546. {
  3547. players = get_players();
  3548. for( i = 0; i < players.size; i++ )
  3549. {
  3550. players[i] thread set_fog( 729.34, 971.99, 338.336, 398.623, 0.58, 0.60, 0.56, 3 );
  3551. }
  3552. }
  3553.  
  3554. level thread [[ level.round_think_func ]]();
  3555. }
  3556.  
  3557.  
  3558. //
  3559. //
  3560. create_chalk_hud( x )
  3561. {
  3562. if( !IsDefined( x ) )
  3563. {
  3564. x = 0;
  3565. }
  3566.  
  3567. hud = create_simple_hud();
  3568. hud.alignX = "left";
  3569. hud.alignY = "bottom";
  3570. hud.horzAlign = "user_left";
  3571. hud.vertAlign = "user_bottom";
  3572. hud.color = ( 0.21, 0, 0 );
  3573. hud.x = x;
  3574. hud.y = -4;
  3575. hud.alpha = 0;
  3576. hud.fontscale = 32.0;
  3577.  
  3578. hud SetShader( "hud_chalk_1", 64, 64 );
  3579.  
  3580. return hud;
  3581. }
  3582.  
  3583.  
  3584. //
  3585. //
  3586. destroy_chalk_hud()
  3587. {
  3588. if( isDefined( level.chalk_hud1 ) )
  3589. {
  3590. level.chalk_hud1 Destroy();
  3591. level.chalk_hud1 = undefined;
  3592. }
  3593.  
  3594. if( isDefined( level.chalk_hud2 ) )
  3595. {
  3596. level.chalk_hud2 Destroy();
  3597. level.chalk_hud2 = undefined;
  3598. }
  3599. }
  3600.  
  3601.  
  3602. //
  3603. // Let's the players know that you need power to open these
  3604. play_door_dialog()
  3605. {
  3606. level endon( "power_on" );
  3607. self endon ("warning_dialog");
  3608. timer = 0;
  3609.  
  3610. while(1)
  3611. {
  3612. wait(0.05);
  3613. players = get_players();
  3614. for(i = 0; i < players.size; i++)
  3615. {
  3616. dist = distancesquared(players[i].origin, self.origin );
  3617. if(dist > 70*70)
  3618. {
  3619. timer =0;
  3620. continue;
  3621. }
  3622. while(dist < 70*70 && timer < 3)
  3623. {
  3624. wait(0.5);
  3625. timer++;
  3626. }
  3627. if(dist > 70*70 && timer >= 3)
  3628. {
  3629. self playsound("door_deny");
  3630.  
  3631. players[i] maps\_zombiemode_audio::create_and_play_dialog( "general", "door_deny" );
  3632. wait(3);
  3633. self notify ("warning_dialog");
  3634. //iprintlnbold("warning_given");
  3635. }
  3636. }
  3637. }
  3638. }
  3639.  
  3640. wait_until_first_player()
  3641. {
  3642. players = get_players();
  3643. if( !IsDefined( players[0] ) )
  3644. {
  3645. level waittill( "first_player_ready" );
  3646. }
  3647. }
  3648.  
  3649. //
  3650. // Set the current round number hud display
  3651. chalk_one_up()
  3652. {
  3653. huds = [];
  3654. huds[0] = level.chalk_hud1;
  3655. huds[1] = level.chalk_hud2;
  3656.  
  3657. // Hud1 shader
  3658. if( level.round_number >= 1 && level.round_number <= 5 )
  3659. {
  3660. huds[0] SetShader( "hud_chalk_" + level.round_number, 64, 64 );
  3661. }
  3662. else if ( level.round_number >= 5 && level.round_number <= 10 )
  3663. {
  3664. huds[0] SetShader( "hud_chalk_5", 64, 64 );
  3665. }
  3666.  
  3667. // Hud2 shader
  3668. if( level.round_number > 5 && level.round_number <= 10 )
  3669. {
  3670. huds[1] SetShader( "hud_chalk_" + ( level.round_number - 5 ), 64, 64 );
  3671. }
  3672.  
  3673. // Display value
  3674. if ( IsDefined( level.chalk_override ) )
  3675. {
  3676. huds[0] SetText( level.chalk_override );
  3677. huds[1] SetText( " " );
  3678. }
  3679. else if( level.round_number <= 5 )
  3680. {
  3681. huds[1] SetText( " " );
  3682. }
  3683. else if( level.round_number > 10 )
  3684. {
  3685. huds[0].fontscale = 32;
  3686. huds[0] SetValue( level.round_number );
  3687. huds[1] SetText( " " );
  3688. }
  3689.  
  3690. if(!IsDefined(level.doground_nomusic))
  3691. {
  3692. level.doground_nomusic = 0;
  3693. }
  3694. if( level.first_round )
  3695. {
  3696. intro = true;
  3697. if( isdefined( level._custom_intro_vox ) )
  3698. {
  3699. level thread [[level._custom_intro_vox]]();
  3700. }
  3701. else
  3702. {
  3703. level thread play_level_start_vox_delayed();
  3704. }
  3705. }
  3706. else
  3707. {
  3708. intro = false;
  3709. }
  3710.  
  3711. //Round Number Specific Lines
  3712. if( level.round_number == 5 || level.round_number == 10 || level.round_number == 20 || level.round_number == 35 || level.round_number == 50 )
  3713. {
  3714. players = getplayers();
  3715. rand = RandomIntRange(0,players.size);
  3716. players[rand] thread maps\_zombiemode_audio::create_and_play_dialog( "general", "round_" + level.round_number );
  3717. }
  3718.  
  3719. round = undefined;
  3720. if( intro )
  3721. {
  3722. // Create "ROUND" hud text
  3723. round = create_simple_hud();
  3724. round.alignX = "center";
  3725. round.alignY = "bottom";
  3726. round.horzAlign = "user_center";
  3727. round.vertAlign = "user_bottom";
  3728. round.fontscale = 16;
  3729. round.color = ( 1, 1, 1 );
  3730. round.x = 0;
  3731. round.y = -265;
  3732. round.alpha = 0;
  3733. round SetText( &"ZOMBIE_ROUND" );
  3734.  
  3735. // huds[0] FadeOverTime( 0.05 );
  3736. huds[0].color = ( 1, 1, 1 );
  3737. huds[0].alpha = 0;
  3738. huds[0].horzAlign = "user_center";
  3739. huds[0].x = -5;
  3740. huds[0].y = -200;
  3741.  
  3742. huds[1] SetText( " " );
  3743.  
  3744. // Fade in white
  3745. round FadeOverTime( 1 );
  3746. round.alpha = 1;
  3747.  
  3748. huds[0] FadeOverTime( 1 );
  3749. huds[0].alpha = 1;
  3750.  
  3751. wait( 1 );
  3752.  
  3753. // Fade to red
  3754. round FadeOverTime( 2 );
  3755. round.color = ( 0.21, 0, 0 );
  3756.  
  3757. huds[0] FadeOverTime( 2 );
  3758. huds[0].color = ( 0.21, 0, 0 );
  3759. wait(2);
  3760. }
  3761. else
  3762. {
  3763. for ( i=0; i<huds.size; i++ )
  3764. {
  3765. huds[i] FadeOverTime( 0.5 );
  3766. huds[i].alpha = 0;
  3767. }
  3768. wait( 0.5 );
  3769. }
  3770.  
  3771. // if( (level.round_number <= 5 || level.round_number >= 11) && IsDefined( level.chalk_hud2 ) )
  3772. // {
  3773. // huds[1] = undefined;
  3774. // }
  3775. //
  3776. for ( i=0; i<huds.size; i++ )
  3777. {
  3778. huds[i] FadeOverTime( 2 );
  3779. huds[i].alpha = 1;
  3780. }
  3781.  
  3782. if( intro )
  3783. {
  3784. wait( 3 );
  3785.  
  3786. if( IsDefined( round ) )
  3787. {
  3788. round FadeOverTime( 1 );
  3789. round.alpha = 0;
  3790. }
  3791.  
  3792. wait( 0.25 );
  3793.  
  3794. level notify( "intro_hud_done" );
  3795. huds[0] MoveOverTime( 1.75 );
  3796. huds[0].horzAlign = "user_left";
  3797. // huds[0].x = 0;
  3798. huds[0].y = -4;
  3799. wait( 2 );
  3800.  
  3801. round destroy_hud();
  3802. }
  3803. else
  3804. {
  3805. for ( i=0; i<huds.size; i++ )
  3806. {
  3807. huds[i].color = ( 1, 1, 1 );
  3808. }
  3809. }
  3810.  
  3811. // Okay now wait just a bit to let the number set in
  3812. if ( !intro )
  3813. {
  3814. wait( 2 );
  3815.  
  3816. for ( i=0; i<huds.size; i++ )
  3817. {
  3818. huds[i] FadeOverTime( 1 );
  3819. huds[i].color = ( 0.21, 0, 0 );
  3820. }
  3821. }
  3822.  
  3823. ReportMTU(level.round_number); // In network debug instrumented builds, causes network spike report to generate.
  3824.  
  3825. // Remove any override set since we're done with it
  3826. if ( IsDefined( level.chalk_override ) )
  3827. {
  3828. level.chalk_override = undefined;
  3829. }
  3830. }
  3831.  
  3832.  
  3833. // Flash the round display at the end of the round
  3834. //
  3835. chalk_round_over()
  3836. {
  3837. huds = [];
  3838. huds[huds.size] = level.chalk_hud1;
  3839. huds[huds.size] = level.chalk_hud2;
  3840.  
  3841. if( level.round_number <= 5 || level.round_number > 10 )
  3842. {
  3843. level.chalk_hud2 SetText( " " );
  3844. }
  3845.  
  3846. time = level.zombie_vars["zombie_between_round_time"];
  3847. if ( time > 3 )
  3848. {
  3849. time = time - 2; // add this deduction back in at the bottom
  3850. }
  3851.  
  3852. for( i = 0; i < huds.size; i++ )
  3853. {
  3854. if( IsDefined( huds[i] ) )
  3855. {
  3856. huds[i] FadeOverTime( time * 0.25 );
  3857. huds[i].color = ( 1, 1, 1 );
  3858. }
  3859. }
  3860.  
  3861. // Pulse
  3862. fade_time = 0.5;
  3863. steps = ( time * 0.5 ) / fade_time;
  3864. for( q = 0; q < steps; q++ )
  3865. {
  3866. for( i = 0; i < huds.size; i++ )
  3867. {
  3868. if( !IsDefined( huds[i] ) )
  3869. {
  3870. continue;
  3871. }
  3872.  
  3873. huds[i] FadeOverTime( fade_time );
  3874. huds[i].alpha = 0;
  3875. }
  3876.  
  3877. wait( fade_time );
  3878.  
  3879. for( i = 0; i < huds.size; i++ )
  3880. {
  3881. if( !IsDefined( huds[i] ) )
  3882. {
  3883. continue;
  3884. }
  3885.  
  3886. huds[i] FadeOverTime( fade_time );
  3887. huds[i].alpha = 1;
  3888. }
  3889.  
  3890. wait( fade_time );
  3891. }
  3892.  
  3893. for( i = 0; i < huds.size; i++ )
  3894. {
  3895. if( !IsDefined( huds[i] ) )
  3896. {
  3897. continue;
  3898. }
  3899.  
  3900. huds[i] FadeOverTime( time * 0.25 );
  3901. // huds[i].color = ( 0.8, 0, 0 );
  3902. huds[i].color = ( 0.21, 0, 0 );
  3903. huds[i].alpha = 0;
  3904. }
  3905.  
  3906. wait ( 2.0 );
  3907. }
  3908.  
  3909. round_think()
  3910. {
  3911. for( ;; )
  3912. {
  3913. //////////////////////////////////////////
  3914. //designed by prod DT#36173
  3915. maxreward = 50 * level.round_number;
  3916. if ( maxreward > 500 )
  3917. maxreward = 500;
  3918. level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward;
  3919. //////////////////////////////////////////
  3920.  
  3921. level.pro_tips_start_time = GetTime();
  3922. level.zombie_last_run_time = GetTime(); // Resets the last time a zombie ran
  3923.  
  3924. level thread maps\_zombiemode_audio::change_zombie_music( "round_start" );
  3925. chalk_one_up();
  3926. // round_text( &"ZOMBIE_ROUND_BEGIN" );
  3927.  
  3928. maps\_zombiemode_powerups::powerup_round_start();
  3929.  
  3930. players = get_players();
  3931. array_thread( players, maps\_zombiemode_blockers::rebuild_barrier_reward_reset );
  3932.  
  3933. //array_thread( players, maps\_zombiemode_ability::giveHardpointItems );
  3934.  
  3935. level thread award_grenades_for_survivors();
  3936.  
  3937. bbPrint( "zombie_rounds: round %d player_count %d", level.round_number, players.size );
  3938.  
  3939. level.round_start_time = GetTime();
  3940. level thread [[level.round_spawn_func]]();
  3941.  
  3942. level notify( "start_of_round" );
  3943.  
  3944. [[level.round_wait_func]]();
  3945.  
  3946. level.first_round = false;
  3947. level notify( "end_of_round" );
  3948.  
  3949. level thread maps\_zombiemode_audio::change_zombie_music( "round_end" );
  3950.  
  3951. UploadStats();
  3952.  
  3953. if ( 1 != players.size )
  3954. {
  3955. level thread spectators_respawn();
  3956. //level thread last_stand_revive();
  3957. }
  3958.  
  3959. // round_text( &"ZOMBIE_ROUND_END" );
  3960. level chalk_round_over();
  3961.  
  3962. // here's the difficulty increase over time area
  3963. timer = level.zombie_vars["zombie_spawn_delay"];
  3964. if ( timer > 0.08 )
  3965. {
  3966. level.zombie_vars["zombie_spawn_delay"] = timer * 0.95;
  3967. }
  3968. else if ( timer < 0.08 )
  3969. {
  3970. level.zombie_vars["zombie_spawn_delay"] = 0.08;
  3971. }
  3972.  
  3973. //
  3974. // Increase the zombie move speed
  3975. level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier"];
  3976.  
  3977. // iPrintlnBold( "End of Round " + level.round_number );
  3978. // for ( i=0; i<level.team_pool.size; i++ )
  3979. // {
  3980. // iPrintlnBold( "Team Pool "+(i+1)+" score: ", level.team_pool[i].score_total );
  3981. // }
  3982. //
  3983. // players = get_players();
  3984. // for ( p=0; p<players.size; p++ )
  3985. // {
  3986. // iPrintlnBold( "Total Player "+(p+1)+" score : "+ players[p].score_total );
  3987. // }
  3988.  
  3989. level.round_number++;
  3990.  
  3991. level notify( "between_round_over" );
  3992. }
  3993. }
  3994.  
  3995.  
  3996. award_grenades_for_survivors()
  3997. {
  3998. players = get_players();
  3999.  
  4000. for (i = 0; i < players.size; i++)
  4001. {
  4002. if (!players[i].is_zombie)
  4003. {
  4004. lethal_grenade = players[i] get_player_lethal_grenade();
  4005. if( !players[i] HasWeapon( lethal_grenade ) )
  4006. {
  4007. players[i] GiveWeapon( lethal_grenade );
  4008. players[i] SetWeaponAmmoClip( lethal_grenade, 0 );
  4009. }
  4010.  
  4011. if ( players[i] GetFractionMaxAmmo( lethal_grenade ) < .25 )
  4012. {
  4013. players[i] SetWeaponAmmoClip( lethal_grenade, 2 );
  4014. }
  4015. else if (players[i] GetFractionMaxAmmo( lethal_grenade ) < .5 )
  4016. {
  4017. players[i] SetWeaponAmmoClip( lethal_grenade, 3 );
  4018. }
  4019. else
  4020. {
  4021. players[i] SetWeaponAmmoClip( lethal_grenade, 4 );
  4022. }
  4023. }
  4024. }
  4025. }
  4026.  
  4027. ai_calculate_health( round_number )
  4028. {
  4029. level.zombie_health = level.zombie_vars["zombie_health_start"];
  4030. for ( i=2; i<=round_number; i++ )
  4031. {
  4032. // After round 10, get exponentially harder
  4033. if( i >= 10 )
  4034. {
  4035. level.zombie_health += Int( level.zombie_health * level.zombie_vars["zombie_health_increase_multiplier"] );
  4036. }
  4037. else
  4038. {
  4039. level.zombie_health = Int( level.zombie_health + level.zombie_vars["zombie_health_increase"] );
  4040. }
  4041. }
  4042. }
  4043.  
  4044. /#
  4045. round_spawn_failsafe_debug()
  4046. {
  4047. level notify( "failsafe_debug_stop" );
  4048. level endon( "failsafe_debug_stop" );
  4049.  
  4050. start = GetTime();
  4051. level.chunk_time = 0;
  4052.  
  4053. while ( 1 )
  4054. {
  4055. level.failsafe_time = GetTime() - start;
  4056.  
  4057. if ( isdefined( self.lastchunk_destroy_time ) )
  4058. {
  4059. level.chunk_time = GetTime() - self.lastchunk_destroy_time;
  4060. }
  4061. wait_network_frame();
  4062. }
  4063. }
  4064. #/
  4065.  
  4066.  
  4067. //put the conditions in here which should
  4068. //cause the failsafe to reset
  4069. round_spawn_failsafe()
  4070. {
  4071. self endon("death");//guy just died
  4072.  
  4073. //////////////////////////////////////////////////////////////
  4074. //FAILSAFE "hack shit" DT#33203
  4075. //////////////////////////////////////////////////////////////
  4076. prevorigin = self.origin;
  4077. while(1)
  4078. {
  4079. if( !level.zombie_vars["zombie_use_failsafe"] )
  4080. {
  4081. return;
  4082. }
  4083.  
  4084. if ( is_true( self.ignore_round_spawn_failsafe ) )
  4085. {
  4086. return;
  4087. }
  4088.  
  4089. wait( 30 );
  4090.  
  4091. //if i've torn a board down in the last 8 seconds, just
  4092. //wait 30 again.
  4093. if ( isDefined(self.lastchunk_destroy_time) )
  4094. {
  4095. if ( (GetTime() - self.lastchunk_destroy_time) < 8000 )
  4096. continue;
  4097. }
  4098.  
  4099. //fell out of world
  4100. if ( self.origin[2] < level.zombie_vars["below_world_check"] )
  4101. {
  4102. if(is_true(level.put_timed_out_zombies_back_in_queue ) && !flag("dog_round") )
  4103. {
  4104. level.zombie_total++;
  4105. }
  4106. self dodamage( self.health + 100, (0,0,0) );
  4107. break;
  4108. }
  4109.  
  4110. //hasnt moved 24 inches in 30 seconds?
  4111. if ( DistanceSquared( self.origin, prevorigin ) < 576 )
  4112. {
  4113.  
  4114. //add this zombie back into the spawner queue to be re-spawned
  4115. if(is_true(level.put_timed_out_zombies_back_in_queue ) && !flag("dog_round"))
  4116. {
  4117. //only if they have crawled thru a window and then timed out
  4118. if(!self.ignoreall && !is_true(self.nuked) && !is_true(self.marked_for_death))
  4119. {
  4120. level.zombie_total++;
  4121. }
  4122. }
  4123.  
  4124. //add this to the stats even tho he really didn't 'die'
  4125. level.zombies_timeout_playspace++;
  4126.  
  4127. // DEBUG HACK
  4128. self dodamage( self.health + 100, (0,0,0) );
  4129. break;
  4130. }
  4131.  
  4132. prevorigin = self.origin;
  4133. }
  4134. //////////////////////////////////////////////////////////////
  4135. //END OF FAILSAFE "hack shit"
  4136. //////////////////////////////////////////////////////////////
  4137. }
  4138.  
  4139. // Waits for the time and the ai to die
  4140. round_wait()
  4141. {
  4142. /#
  4143. if (GetDvarInt( #"zombie_rise_test") )
  4144. {
  4145. level waittill("forever"); // TESTING: don't advance rounds
  4146. }
  4147. #/
  4148.  
  4149. /#
  4150. if ( GetDvarInt( #"zombie_cheat" ) == 2 || GetDvarInt( #"zombie_cheat" ) >= 4 )
  4151. {
  4152. level waittill("forever");
  4153. }
  4154. #/
  4155.  
  4156. wait( 1 );
  4157.  
  4158. if( flag("dog_round" ) )
  4159. {
  4160. wait(7);
  4161. while( level.dog_intermission )
  4162. {
  4163. wait(0.5);
  4164. }
  4165. }
  4166. else
  4167. {
  4168. while( get_enemy_count() > 0 || level.zombie_total > 0 || level.intermission )
  4169. {
  4170. if( flag( "end_round_wait" ) )
  4171. {
  4172. return;
  4173. }
  4174. wait( 1.0 );
  4175. }
  4176. }
  4177. }
  4178.  
  4179.  
  4180. is_friendly_fire_on()
  4181. {
  4182. return level.mutators[ "mutator_friendlyFire" ];
  4183. }
  4184.  
  4185.  
  4186. can_revive( reviver )
  4187. {
  4188. if( self has_powerup_weapon() )
  4189. {
  4190. return false;
  4191. }
  4192.  
  4193. return true;
  4194. }
  4195.  
  4196.  
  4197. zombify_player()
  4198. {
  4199. self maps\_zombiemode_score::player_died_penalty();
  4200.  
  4201. bbPrint( "zombie_playerdeaths: round %d playername %s deathtype died x %f y %f z %f", level.round_number, self.playername, self.origin );
  4202.  
  4203. if ( IsDefined( level.deathcard_spawn_func ) )
  4204. {
  4205. self [[level.deathcard_spawn_func]]();
  4206. }
  4207.  
  4208. if( !IsDefined( level.zombie_vars["zombify_player"] ) || !level.zombie_vars["zombify_player"] )
  4209. {
  4210. if (!is_true(self.solo_respawn ))
  4211. {
  4212. self thread spawnSpectator();
  4213. }
  4214.  
  4215. return;
  4216. }
  4217.  
  4218. self.ignoreme = true;
  4219. self.is_zombie = true;
  4220. self.zombification_time = GetTime();
  4221.  
  4222. self.team = "axis";
  4223. self notify( "zombified" );
  4224.  
  4225. if( IsDefined( self.revivetrigger ) )
  4226. {
  4227. self.revivetrigger Delete();
  4228. }
  4229. self.revivetrigger = undefined;
  4230.  
  4231. self setMoveSpeedScale( 0.3 );
  4232. self reviveplayer();
  4233.  
  4234. self TakeAllWeapons();
  4235. //self starttanning();
  4236. self GiveWeapon( "zombie_melee", 0 );
  4237. self SwitchToWeapon( "zombie_melee" );
  4238. self DisableWeaponCycling();
  4239. self DisableOffhandWeapons();
  4240. self VisionSetNaked( "zombie_turned", 1 );
  4241.  
  4242. maps\_utility::setClientSysState( "zombify", 1, self ); // Zombie grain goooo
  4243.  
  4244. self thread maps\_zombiemode_spawner::zombie_eye_glow();
  4245.  
  4246. // set up the ground ref ent
  4247. self thread injured_walk();
  4248. // allow for zombie attacks, but they lose points?
  4249.  
  4250. self thread playerzombie_player_damage();
  4251. self thread playerzombie_soundboard();
  4252. }
  4253.  
  4254. playerzombie_player_damage()
  4255. {
  4256. self endon( "death" );
  4257. self endon( "disconnect" );
  4258.  
  4259. self thread playerzombie_infinite_health(); // manually keep regular health up
  4260. self.zombiehealth = level.zombie_health;
  4261.  
  4262. // enable PVP damage on this guy
  4263. // self EnablePvPDamage();
  4264.  
  4265. while( 1 )
  4266. {
  4267. self waittill( "damage", amount, attacker, directionVec, point, type );
  4268.  
  4269. if( !IsDefined( attacker ) || !IsPlayer( attacker ) )
  4270. {
  4271. wait( 0.05 );
  4272. continue;
  4273. }
  4274.  
  4275. self.zombiehealth -= amount;
  4276.  
  4277. if( self.zombiehealth <= 0 )
  4278. {
  4279. // "down" the zombie
  4280. self thread playerzombie_downed_state();
  4281. self waittill( "playerzombie_downed_state_done" );
  4282. self.zombiehealth = level.zombie_health;
  4283. }
  4284. }
  4285. }
  4286.  
  4287. playerzombie_downed_state()
  4288. {
  4289. self endon( "death" );
  4290. self endon( "disconnect" );
  4291.  
  4292. downTime = 15;
  4293.  
  4294. startTime = GetTime();
  4295. endTime = startTime +( downTime * 1000 );
  4296.  
  4297. self thread playerzombie_downed_hud();
  4298.  
  4299. self.playerzombie_soundboard_disable = true;
  4300. self thread maps\_zombiemode_spawner::zombie_eye_glow_stop();
  4301. self DisableWeapons();
  4302. self AllowStand( false );
  4303. self AllowCrouch( false );
  4304. self AllowProne( true );
  4305.  
  4306. while( GetTime() < endTime )
  4307. {
  4308. wait( 0.05 );
  4309. }
  4310.  
  4311. self.playerzombie_soundboard_disable = false;
  4312. self thread maps\_zombiemode_spawner::zombie_eye_glow();
  4313. self EnableWeapons();
  4314. self AllowStand( true );
  4315. self AllowCrouch( false );
  4316. self AllowProne( false );
  4317.  
  4318. self notify( "playerzombie_downed_state_done" );
  4319. }
  4320.  
  4321. playerzombie_downed_hud()
  4322. {
  4323. self endon( "death" );
  4324. self endon( "disconnect" );
  4325.  
  4326. text = NewClientHudElem( self );
  4327. text.alignX = "center";
  4328. text.alignY = "middle";
  4329. text.horzAlign = "user_center";
  4330. text.vertAlign = "user_bottom";
  4331. text.foreground = true;
  4332. text.font = "default";
  4333. text.fontScale = 1.8;
  4334. text.alpha = 0;
  4335. text.color = ( 1.0, 1.0, 1.0 );
  4336. text SetText( &"ZOMBIE_PLAYERZOMBIE_DOWNED" );
  4337.  
  4338. text.y = -113;
  4339. if( IsSplitScreen() )
  4340. {
  4341. text.y = -137;
  4342. }
  4343.  
  4344. text FadeOverTime( 0.1 );
  4345. text.alpha = 1;
  4346.  
  4347. self waittill( "playerzombie_downed_state_done" );
  4348.  
  4349. text FadeOverTime( 0.1 );
  4350. text.alpha = 0;
  4351. }
  4352.  
  4353. playerzombie_infinite_health()
  4354. {
  4355. self endon( "death" );
  4356. self endon( "disconnect" );
  4357.  
  4358. bighealth = 100000;
  4359.  
  4360. while( 1 )
  4361. {
  4362. if( self.health < bighealth )
  4363. {
  4364. self.health = bighealth;
  4365. }
  4366.  
  4367. wait( 0.1 );
  4368. }
  4369. }
  4370.  
  4371. playerzombie_soundboard()
  4372. {
  4373. self endon( "death" );
  4374. self endon( "disconnect" );
  4375.  
  4376. self.playerzombie_soundboard_disable = false;
  4377.  
  4378. self.buttonpressed_use = false;
  4379. self.buttonpressed_attack = false;
  4380. self.buttonpressed_ads = false;
  4381.  
  4382. self.useSound_waitTime = 3 * 1000; // milliseconds
  4383. self.useSound_nextTime = GetTime();
  4384. useSound = "playerzombie_usebutton_sound";
  4385.  
  4386. self.attackSound_waitTime = 3 * 1000;
  4387. self.attackSound_nextTime = GetTime();
  4388. attackSound = "playerzombie_attackbutton_sound";
  4389.  
  4390. self.adsSound_waitTime = 3 * 1000;
  4391. self.adsSound_nextTime = GetTime();
  4392. adsSound = "playerzombie_adsbutton_sound";
  4393.  
  4394. self.inputSound_nextTime = GetTime(); // don't want to be able to do all sounds at once
  4395.  
  4396. while( 1 )
  4397. {
  4398. if( self.playerzombie_soundboard_disable )
  4399. {
  4400. wait( 0.05 );
  4401. continue;
  4402. }
  4403.  
  4404. if( self UseButtonPressed() )
  4405. {
  4406. if( self can_do_input( "use" ) )
  4407. {
  4408. self thread playerzombie_play_sound( useSound );
  4409. self thread playerzombie_waitfor_buttonrelease( "use" );
  4410. self.useSound_nextTime = GetTime() + self.useSound_waitTime;
  4411. }
  4412. }
  4413. else if( self AttackButtonPressed() )
  4414. {
  4415. if( self can_do_input( "attack" ) )
  4416. {
  4417. self thread playerzombie_play_sound( attackSound );
  4418. self thread playerzombie_waitfor_buttonrelease( "attack" );
  4419. self.attackSound_nextTime = GetTime() + self.attackSound_waitTime;
  4420. }
  4421. }
  4422. else if( self AdsButtonPressed() )
  4423. {
  4424. if( self can_do_input( "ads" ) )
  4425. {
  4426. self thread playerzombie_play_sound( adsSound );
  4427. self thread playerzombie_waitfor_buttonrelease( "ads" );
  4428. self.adsSound_nextTime = GetTime() + self.adsSound_waitTime;
  4429. }
  4430. }
  4431.  
  4432. wait( 0.05 );
  4433. }
  4434. }
  4435.  
  4436. can_do_input( inputType )
  4437. {
  4438. if( GetTime() < self.inputSound_nextTime )
  4439. {
  4440. return false;
  4441. }
  4442.  
  4443. canDo = false;
  4444.  
  4445. switch( inputType )
  4446. {
  4447. case "use":
  4448. if( GetTime() >= self.useSound_nextTime && !self.buttonpressed_use )
  4449. {
  4450. canDo = true;
  4451. }
  4452. break;
  4453.  
  4454. case "attack":
  4455. if( GetTime() >= self.attackSound_nextTime && !self.buttonpressed_attack )
  4456. {
  4457. canDo = true;
  4458. }
  4459. break;
  4460.  
  4461. case "ads":
  4462. if( GetTime() >= self.useSound_nextTime && !self.buttonpressed_ads )
  4463. {
  4464. canDo = true;
  4465. }
  4466. break;
  4467.  
  4468. default:
  4469. ASSERTMSG( "can_do_input(): didn't recognize inputType of " + inputType );
  4470. break;
  4471. }
  4472.  
  4473. return canDo;
  4474. }
  4475.  
  4476. playerzombie_play_sound( alias )
  4477. {
  4478. self play_sound_on_ent( alias );
  4479. }
  4480.  
  4481. playerzombie_waitfor_buttonrelease( inputType )
  4482. {
  4483. if( inputType != "use" && inputType != "attack" && inputType != "ads" )
  4484. {
  4485. ASSERTMSG( "playerzombie_waitfor_buttonrelease(): inputType of " + inputType + " is not recognized." );
  4486. return;
  4487. }
  4488.  
  4489. notifyString = "waitfor_buttonrelease_" + inputType;
  4490. self notify( notifyString );
  4491. self endon( notifyString );
  4492.  
  4493. if( inputType == "use" )
  4494. {
  4495. self.buttonpressed_use = true;
  4496. while( self UseButtonPressed() )
  4497. {
  4498. wait( 0.05 );
  4499. }
  4500. self.buttonpressed_use = false;
  4501. }
  4502.  
  4503. else if( inputType == "attack" )
  4504. {
  4505. self.buttonpressed_attack = true;
  4506. while( self AttackButtonPressed() )
  4507. {
  4508. wait( 0.05 );
  4509. }
  4510. self.buttonpressed_attack = false;
  4511. }
  4512.  
  4513. else if( inputType == "ads" )
  4514. {
  4515. self.buttonpressed_ads = true;
  4516. while( self AdsButtonPressed() )
  4517. {
  4518. wait( 0.05 );
  4519. }
  4520. self.buttonpressed_ads = false;
  4521. }
  4522. }
  4523.  
  4524. remove_ignore_attacker()
  4525. {
  4526. self notify( "new_ignore_attacker" );
  4527. self endon( "new_ignore_attacker" );
  4528. self endon( "disconnect" );
  4529.  
  4530. if( !isDefined( level.ignore_enemy_timer ) )
  4531. {
  4532. level.ignore_enemy_timer = 0.4;
  4533. }
  4534.  
  4535. wait( level.ignore_enemy_timer );
  4536.  
  4537. self.ignoreAttacker = undefined;
  4538. }
  4539.  
  4540. player_damage_override_cheat( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
  4541. {
  4542. player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  4543. return 0;
  4544. }
  4545.  
  4546.  
  4547. //
  4548. // player_damage_override
  4549. // MUST return the value of the damage override
  4550. //
  4551. // MM (08/10/09) - Removed calls to PlayerDamageWrapper because it's always called in
  4552. // Callback_PlayerDamage now. We just need to return the damage.
  4553. //
  4554. player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
  4555. {
  4556. iDamage = self check_player_damage_callbacks( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  4557. if ( !iDamage )
  4558. {
  4559. return 0;
  4560. }
  4561.  
  4562. // WW (8/14/10) - If a player is hit by the crossbow bolt then set them as the holder of the monkey shot
  4563. if( sWeapon == "crossbow_explosive_upgraded_zm" && sMeansOfDeath == "MOD_IMPACT" )
  4564. {
  4565. level.monkey_bolt_holder = self;
  4566. }
  4567.  
  4568. // Raven - snigl - Notify of blow gun hit
  4569. if( GetSubStr(sWeapon, 0, 8 ) == "blow_gun" && sMeansOfDeath == "MOD_IMPACT" )
  4570. {
  4571. eAttacker notify( "blow_gun_hit", self, eInflictor );
  4572. }
  4573.  
  4574. // WW (8/20/10) - Sledgehammer fix for Issue 43492. This should stop the player from taking any damage while in laststand
  4575. if( self maps\_laststand::player_is_in_laststand() )
  4576. {
  4577. return 0;
  4578. }
  4579.  
  4580. if ( isDefined( eInflictor ) )
  4581. {
  4582. if ( is_true( eInflictor.water_damage ) )
  4583. {
  4584. return 0;
  4585. }
  4586. }
  4587.  
  4588. if( isDefined( eAttacker ) )
  4589. {
  4590.  
  4591. //tracking player damage
  4592. if(is_true(eAttacker.is_zombie))
  4593. {
  4594. self.stats["damage_taken"] += iDamage;
  4595. }
  4596.  
  4597. if( isDefined( self.ignoreAttacker ) && self.ignoreAttacker == eAttacker )
  4598. {
  4599. return 0;
  4600. }
  4601.  
  4602. if( (isDefined( eAttacker.is_zombie ) && eAttacker.is_zombie) || level.mutators["mutator_friendlyFire"] )
  4603. {
  4604. self.ignoreAttacker = eAttacker;
  4605. self thread remove_ignore_attacker();
  4606.  
  4607. if ( isdefined( eAttacker.custom_damage_func ) )
  4608. {
  4609. iDamage = eAttacker [[ eAttacker.custom_damage_func ]]( self );
  4610. }
  4611. else if ( isdefined( eAttacker.meleeDamage ) )
  4612. {
  4613. iDamage = eAttacker.meleeDamage;
  4614. }
  4615. else
  4616. {
  4617. iDamage = 50; // 45
  4618. }
  4619. }
  4620.  
  4621. eAttacker notify( "hit_player" );
  4622.  
  4623.  
  4624. if( is_true(eattacker.is_zombie) && eattacker.animname == "director_zombie" )
  4625. {
  4626. self PlaySound( "zmb_director_light_hit" );
  4627. if(RandomIntRange(0,1) == 0 )
  4628. {
  4629. self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "hitmed" );
  4630. }
  4631. else
  4632. {
  4633. self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "hitlrg" );
  4634. }
  4635. }
  4636. else if( sMeansOfDeath != "MOD_FALLING" )
  4637. {
  4638. self PlaySound( "evt_player_swiped" );
  4639. if(RandomIntRange(0,1) == 0 )
  4640. {
  4641. self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "hitmed" );
  4642. }
  4643. else
  4644. {
  4645. self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "hitlrg" );
  4646. }
  4647. }
  4648. }
  4649. finalDamage = iDamage;
  4650.  
  4651. // claymores and freezegun shatters, like bouncing betties, harm no players
  4652. if ( is_placeable_mine( sWeapon ) || sWeapon == "freezegun_zm" || sWeapon == "freezegun_upgraded_zm" )
  4653. {
  4654. return 0;
  4655. }
  4656.  
  4657. if ( isDefined( self.player_damage_override ) )
  4658. {
  4659. self thread [[ self.player_damage_override ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  4660. }
  4661.  
  4662. if( sMeansOfDeath == "MOD_FALLING" )
  4663. {
  4664. if ( self HasPerk( "specialty_flakjacket" ) && isdefined( self.divetoprone ) && self.divetoprone == 1 )
  4665. {
  4666. if ( IsDefined( level.zombiemode_divetonuke_perk_func ) )
  4667. {
  4668. [[ level.zombiemode_divetonuke_perk_func ]]( self, self.origin );
  4669. }
  4670.  
  4671. return 0;
  4672. }
  4673. }
  4674.  
  4675. if( sMeansOfDeath == "MOD_PROJECTILE" || sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" )
  4676. {
  4677. // check for reduced damage from flak jacket perk
  4678. if ( self HasPerk( "specialty_flakjacket" ) )
  4679. {
  4680. return 0;
  4681. }
  4682.  
  4683. if( self.health > 75 )
  4684. {
  4685. // MM (08/10/09)
  4686. return 75;
  4687. }
  4688. }
  4689.  
  4690. if( iDamage < self.health )
  4691. {
  4692. if ( IsDefined( eAttacker ) )
  4693. {
  4694. eAttacker.sound_damage_player = self;
  4695.  
  4696. if( IsDefined( eAttacker.has_legs ) && !eAttacker.has_legs )
  4697. {
  4698. self maps\_zombiemode_audio::create_and_play_dialog( "general", "crawl_hit" );
  4699. }
  4700. else if( IsDefined( eAttacker.animname ) && ( eAttacker.animname == "monkey_zombie" ) )
  4701. {
  4702. self maps\_zombiemode_audio::create_and_play_dialog( "general", "monkey_hit" );
  4703. }
  4704. }
  4705.  
  4706. // MM (08/10/09)
  4707. return finalDamage;
  4708. }
  4709. if( level.intermission )
  4710. {
  4711. level waittill( "forever" );
  4712. }
  4713.  
  4714. players = get_players();
  4715. count = 0;
  4716. for( i = 0; i < players.size; i++ )
  4717. {
  4718. if( players[i] == self || players[i].is_zombie || players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator" )
  4719. {
  4720. count++;
  4721. }
  4722. }
  4723. if( count < players.size )
  4724. {
  4725. // MM (08/10/09)
  4726. return finalDamage;
  4727. }
  4728.  
  4729. //if ( maps\_zombiemode_solo::solo_has_lives() )
  4730. //{
  4731. // SetDvar( "player_lastStandBleedoutTime", "3" );
  4732. //}
  4733. //else
  4734. //{
  4735. if ( players.size == 1 && flag( "solo_game" ) )
  4736. {
  4737. if ( self.lives == 0 )
  4738. {
  4739. self.intermission = true;
  4740. }
  4741. }
  4742. //}
  4743.  
  4744. // WW (01/05/11): When a two players enter a system link game and the client drops the host will be treated as if it was a solo game
  4745. // when it wasn't. This led to SREs about undefined and int being compared on death (self.lives was never defined on the host). While
  4746. // adding the check for the solo game flag we found that we would have to create a complex OR inside of the if check below. By breaking
  4747. // the conditions out in to their own variables we keep the complexity without making it look like a mess.
  4748. solo_death = ( players.size == 1 && flag( "solo_game" ) && self.lives == 0 ); // there is only one player AND the flag is set AND self.lives equals 0
  4749. non_solo_death = ( players.size > 1 || ( players.size == 1 && !flag( "solo_game" ) ) ); // the player size is greater than one OR ( players.size equals 1 AND solo flag isn't set )
  4750.  
  4751. if ( solo_death || non_solo_death ) // if only one player on their last life or any game that started with more than one player
  4752. {
  4753. self thread maps\_laststand::PlayerLastStand( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime );
  4754. self player_fake_death();
  4755. }
  4756.  
  4757. if( count == players.size )
  4758. {
  4759. //if ( !maps\_zombiemode_solo::solo_has_lives() )
  4760. //{
  4761.  
  4762. if ( players.size == 1 && flag( "solo_game" ) )
  4763. {
  4764. if ( self.lives == 0 ) // && !self maps\_laststand::player_is_in_laststand()
  4765. {
  4766.  
  4767. level notify("pre_end_game");
  4768. wait_network_frame();
  4769.  
  4770. level notify( "end_game" );
  4771. }
  4772. else
  4773. {
  4774. self thread wait_and_revive();
  4775. return finalDamage;
  4776. }
  4777. }
  4778. else
  4779. {
  4780. level notify("pre_end_game");
  4781. wait_network_frame();
  4782.  
  4783. level notify( "end_game" );
  4784. }
  4785. //}
  4786.  
  4787. return 0; // MM (09/16/09) Need to return something
  4788. }
  4789. else
  4790. {
  4791. // MM (08/10/09)
  4792. return finalDamage;
  4793. }
  4794. }
  4795.  
  4796.  
  4797. check_player_damage_callbacks( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
  4798. {
  4799. if ( !isdefined( level.player_damage_callbacks ) )
  4800. {
  4801. return iDamage;
  4802. }
  4803.  
  4804. for ( i = 0; i < level.player_damage_callbacks.size; i++ )
  4805. {
  4806. newDamage = self [[ level.player_damage_callbacks[i] ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  4807. if ( -1 != newDamage )
  4808. {
  4809. return newDamage;
  4810. }
  4811. }
  4812.  
  4813. return iDamage;
  4814. }
  4815.  
  4816.  
  4817. register_player_damage_callback( func )
  4818. {
  4819. if ( !isdefined( level.player_damage_callbacks ) )
  4820. {
  4821. level.player_damage_callbacks = [];
  4822. }
  4823.  
  4824. level.player_damage_callbacks[level.player_damage_callbacks.size] = func;
  4825. }
  4826.  
  4827.  
  4828. wait_and_revive()
  4829. {
  4830. flag_set( "wait_and_revive" );
  4831.  
  4832. if ( isdefined( self.waiting_to_revive ) && self.waiting_to_revive == true )
  4833. {
  4834. return;
  4835. }
  4836.  
  4837. self.waiting_to_revive = true;
  4838. if ( isdefined( level.exit_level_func ) )
  4839. {
  4840. self thread [[ level.exit_level_func ]]();
  4841. }
  4842. else
  4843. {
  4844. self thread default_exit_level();
  4845. }
  4846.  
  4847. // wait to actually go into last stand before reviving
  4848. while ( 1 )
  4849. {
  4850. if ( self maps\_laststand::player_is_in_laststand() )
  4851. {
  4852. break;
  4853. }
  4854.  
  4855. wait_network_frame();
  4856. }
  4857.  
  4858. solo_revive_time = 10.0;
  4859.  
  4860. self.revive_hud setText( &"ZOMBIE_REVIVING_SOLO", self );
  4861. self maps\_laststand::revive_hud_show_n_fade( solo_revive_time );
  4862.  
  4863. flag_wait_or_timeout("instant_revive", solo_revive_time);
  4864.  
  4865. flag_clear( "wait_and_revive" );
  4866.  
  4867. self maps\_laststand::auto_revive( self );
  4868. self.lives--;
  4869. self.waiting_to_revive = false;
  4870. }
  4871.  
  4872. //
  4873. // MUST return the value of the damage override
  4874. //
  4875. actor_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, modelIndex, psOffsetTime )
  4876. {
  4877. // WW (8/14/10) - define the owner of the monkey shot
  4878. if( weapon == "crossbow_explosive_upgraded_zm" && meansofdeath == "MOD_IMPACT" )
  4879. {
  4880. level.monkey_bolt_holder = self;
  4881. }
  4882.  
  4883. // Raven - snigl - Record what the blow gun hit
  4884. if( GetSubStr(weapon, 0, 8 ) == "blow_gun" && meansofdeath == "MOD_IMPACT" )
  4885. {
  4886. attacker notify( "blow_gun_hit", self, inflictor );
  4887. }
  4888.  
  4889. if ( isdefined( attacker.animname ) && attacker.animname == "quad_zombie" )
  4890. {
  4891. if ( isdefined( self.animname ) && self.animname == "quad_zombie" )
  4892. {
  4893. return 0;
  4894. }
  4895. }
  4896.  
  4897. // skip conditions
  4898. if( !isdefined( self) || !isdefined( attacker ) )
  4899. return damage;
  4900. if ( !isplayer( attacker ) && isdefined( self.non_attacker_func ) )
  4901. {
  4902. override_damage = self [[ self.non_attacker_func ]]( damage, weapon );
  4903. if ( override_damage )
  4904. return override_damage;
  4905. }
  4906. if ( !isplayer( attacker ) && !isplayer( self ) )
  4907. return damage;
  4908. if( !isdefined( damage ) || !isdefined( meansofdeath ) )
  4909. return damage;
  4910. if( meansofdeath == "" )
  4911. return damage;
  4912.  
  4913.  
  4914.  
  4915. // println( "*********HIT : Zombie health: "+self.health+", dam:"+damage+", weapon:"+ weapon );
  4916.  
  4917. old_damage = damage;
  4918. final_damage = damage;
  4919.  
  4920. if ( IsDefined( self.actor_damage_func ) )
  4921. {
  4922. final_damage = [[ self.actor_damage_func ]]( weapon, old_damage, attacker );
  4923. }
  4924.  
  4925. if ( IsDefined( self.actor_full_damage_func ) )
  4926. {
  4927. final_damage = [[ self.actor_full_damage_func ]]( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, modelIndex, psOffsetTime );
  4928. }
  4929.  
  4930. // debug
  4931. /#
  4932. if ( GetDvarInt( #"scr_perkdebug") )
  4933. println( "Perk/> Damage Factor: " + final_damage/old_damage + " - Pre Damage: " + old_damage + " - Post Damage: " + final_damage );
  4934. #/
  4935.  
  4936. if( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) )
  4937. attacker = attacker.owner;
  4938.  
  4939. if( !isDefined( self.damage_assists ) )
  4940. {
  4941. self.damage_assists = [];
  4942. }
  4943.  
  4944. if ( !isdefined( self.damage_assists[attacker.entity_num] ) )
  4945. {
  4946. self.damage_assists[attacker.entity_num] = attacker;
  4947. }
  4948.  
  4949. if( level.mutators[ "mutator_headshotsOnly" ] && !is_headshot( weapon, sHitLoc, meansofdeath ) )
  4950. {
  4951. return 0;
  4952. }
  4953.  
  4954. if( level.mutators[ "mutator_powerShot" ] )
  4955. {
  4956. final_damage = int( final_damage * 1.5 );
  4957. }
  4958.  
  4959. if ( is_true( self.in_water ) )
  4960. {
  4961. if ( int( final_damage ) >= self.health )
  4962. {
  4963. self.water_damage = true;
  4964. }
  4965. }
  4966.  
  4967. // return unchanged damage
  4968. //iPrintln( final_damage );
  4969. return int( final_damage );
  4970. }
  4971.  
  4972. is_headshot( sWeapon, sHitLoc, sMeansOfDeath )
  4973. {
  4974. return (sHitLoc == "head" || sHitLoc == "helmet") && sMeansOfDeath != "MOD_MELEE" && sMeansOfDeath != "MOD_BAYONET" && sMeansOfDeath != "MOD_IMPACT"; //CoD5: MGs need to cause headshots as well. && !isMG( sWeapon );
  4975. }
  4976.  
  4977. actor_killed_override(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime)
  4978. {
  4979. if ( game["state"] == "postgame" )
  4980. return;
  4981.  
  4982. if( isai(attacker) && isDefined( attacker.script_owner ) )
  4983. {
  4984. // if the person who called the dogs in switched teams make sure they don't
  4985. // get penalized for the kill
  4986. if ( attacker.script_owner.team != self.aiteam )
  4987. attacker = attacker.script_owner;
  4988. }
  4989.  
  4990. if( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) )
  4991. attacker = attacker.owner;
  4992.  
  4993. if( IsPlayer( level.monkey_bolt_holder ) && sMeansOfDeath == "MOD_GRENADE_SPLASH"
  4994. && ( sWeapon == "crossbow_explosive_upgraded_zm" || sWeapon == "explosive_bolt_upgraded_zm" ) ) //
  4995. {
  4996. level._bolt_on_back = level._bolt_on_back + 1;
  4997. }
  4998.  
  4999.  
  5000. if ( isdefined( attacker ) && isplayer( attacker ) )
  5001. {
  5002. multiplier = 1;
  5003. if( is_headshot( sWeapon, sHitLoc, sMeansOfDeath ) )
  5004. {
  5005. multiplier = 1.5;
  5006. }
  5007.  
  5008. type = undefined;
  5009.  
  5010. //MM (3/18/10) no animname check
  5011. if ( IsDefined(self.animname) )
  5012. {
  5013. switch( self.animname )
  5014. {
  5015. case "quad_zombie":
  5016. type = "quadkill";
  5017. break;
  5018. case "ape_zombie":
  5019. type = "apekill";
  5020. break;
  5021. case "zombie":
  5022. type = "zombiekill";
  5023. break;
  5024. case "zombie_dog":
  5025. type = "dogkill";
  5026. break;
  5027. }
  5028. }
  5029. //if( isDefined( type ) )
  5030. //{
  5031. // value = maps\_zombiemode_rank::getScoreInfoValue( type );
  5032. // self process_assist( type, attacker );
  5033.  
  5034. // value = int( value * multiplier );
  5035. // attacker thread maps\_zombiemode_rank::giveRankXP( type, value, false, false );
  5036. //}
  5037. }
  5038.  
  5039. if(is_true(self.is_ziplining))
  5040. {
  5041. self.deathanim = undefined;
  5042. }
  5043.  
  5044. if ( IsDefined( self.actor_killed_override ) )
  5045. {
  5046. self [[ self.actor_killed_override ]]( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime );
  5047. }
  5048.  
  5049. }
  5050.  
  5051.  
  5052. process_assist( type, attacker )
  5053. {
  5054. if ( isDefined( self.damage_assists ) )
  5055. {
  5056. for ( j = 0; j < self.damage_assists.size; j++ )
  5057. {
  5058. player = self.damage_assists[j];
  5059.  
  5060. if ( !isDefined( player ) )
  5061. continue;
  5062.  
  5063. if ( player == attacker )
  5064. continue;
  5065.  
  5066. //assist_xp = maps\_zombiemode_rank::getScoreInfoValue( type + "_assist" );
  5067. //player thread maps\_zombiemode_rank::giveRankXP( type + "_assist", assist_xp );
  5068. }
  5069. self.damage_assists = undefined;
  5070. }
  5071. }
  5072.  
  5073.  
  5074. end_game()
  5075. {
  5076. level waittill ( "end_game" );
  5077.  
  5078. clientnotify( "zesn" );
  5079. level thread maps\_zombiemode_audio::change_zombie_music( "game_over" );
  5080.  
  5081. //AYERS: Turn off ANY last stand audio at the end of the game
  5082. players = get_players();
  5083. for( i = 0; i < players.size; i++ )
  5084. {
  5085. setClientSysState( "lsm", "0", players[i] );
  5086. }
  5087.  
  5088. StopAllRumbles();
  5089.  
  5090. level.intermission = true;
  5091. level.zombie_vars["zombie_powerup_insta_kill_time"] = 0;
  5092. level.zombie_vars["zombie_powerup_fire_sale_time"] = 0;
  5093. level.zombie_vars["zombie_powerup_point_doubler_time"] = 0;
  5094. wait 0.1;
  5095.  
  5096. update_leaderboards();
  5097.  
  5098. game_over = [];
  5099. survived = [];
  5100.  
  5101. players = get_players();
  5102. for( i = 0; i < players.size; i++ )
  5103. {
  5104. game_over[i] = NewClientHudElem( players[i] );
  5105. game_over[i].alignX = "center";
  5106. game_over[i].alignY = "middle";
  5107. game_over[i].horzAlign = "center";
  5108. game_over[i].vertAlign = "middle";
  5109. game_over[i].y -= 130;
  5110. game_over[i].foreground = true;
  5111. game_over[i].fontScale = 3;
  5112. game_over[i].alpha = 0;
  5113. game_over[i].color = ( 1.0, 1.0, 1.0 );
  5114. game_over[i] SetText( &"ZOMBIE_GAME_OVER" );
  5115.  
  5116. game_over[i] FadeOverTime( 1 );
  5117. game_over[i].alpha = 1;
  5118. if ( players[i] isSplitScreen() )
  5119. {
  5120. game_over[i].y += 40;
  5121. }
  5122.  
  5123. survived[i] = NewClientHudElem( players[i] );
  5124. survived[i].alignX = "center";
  5125. survived[i].alignY = "middle";
  5126. survived[i].horzAlign = "center";
  5127. survived[i].vertAlign = "middle";
  5128. survived[i].y -= 100;
  5129. survived[i].foreground = true;
  5130. survived[i].fontScale = 2;
  5131. survived[i].alpha = 0;
  5132. survived[i].color = ( 1.0, 1.0, 1.0 );
  5133. if ( players[i] isSplitScreen() )
  5134. {
  5135. survived[i].y += 40;
  5136. }
  5137.  
  5138. //OLD COUNT METHOD
  5139. if( level.round_number < 2 )
  5140. {
  5141. if( level.script == "zombie_moon" )
  5142. {
  5143. if( !isdefined(level.left_nomans_land) )
  5144. {
  5145. nomanslandtime = level.nml_best_time;
  5146. player_survival_time = int( nomanslandtime/1000 );
  5147. player_survival_time_in_mins = maps\_zombiemode::to_mins( player_survival_time );
  5148. survived[i] SetText( &"ZOMBIE_SURVIVED_NOMANS", player_survival_time_in_mins );
  5149. }
  5150. else if( level.left_nomans_land==2 )
  5151. {
  5152. survived[i] SetText( &"ZOMBIE_SURVIVED_ROUND" );
  5153. }
  5154. }
  5155. else
  5156. {
  5157. survived[i] SetText( &"ZOMBIE_SURVIVED_ROUND" );
  5158. }
  5159. }
  5160. else
  5161. {
  5162. survived[i] SetText( &"ZOMBIE_SURVIVED_ROUNDS", level.round_number );
  5163. }
  5164.  
  5165. survived[i] FadeOverTime( 1 );
  5166. survived[i].alpha = 1;
  5167. }
  5168.  
  5169. players = get_players();
  5170. for (i = 0; i < players.size; i++)
  5171. {
  5172. players[i] SetClientDvars( "ammoCounterHide", "1",
  5173. "miniscoreboardhide", "1" );
  5174. //players[i] maps\_zombiemode_solo::solo_destroy_lives_hud();
  5175. //players[i] maps\_zombiemode_ability::clear_hud();
  5176. }
  5177. destroy_chalk_hud();
  5178.  
  5179. UploadStats();
  5180.  
  5181. wait( 1 );
  5182.  
  5183. //play_sound_at_pos( "end_of_game", ( 0, 0, 0 ) );
  5184. wait( 2 );
  5185. intermission();
  5186. wait( level.zombie_vars["zombie_intermission_time"] );
  5187.  
  5188. level notify( "stop_intermission" );
  5189. array_thread( get_players(), ::player_exit_level );
  5190.  
  5191. bbPrint( "zombie_epilogs: rounds %d", level.round_number );
  5192.  
  5193. players = get_players();
  5194. for (i = 0; i < players.size; i++)
  5195. {
  5196. survived[i] FadeOverTime( 1 );
  5197. survived[i].alpha = 0;
  5198. game_over[i] FadeOverTime( 1 );
  5199. game_over[i].alpha = 0;
  5200. }
  5201.  
  5202. wait( 1.5 );
  5203.  
  5204.  
  5205. /* we are not currently supporting the shared screen tech
  5206. if( IsSplitScreen() )
  5207. {
  5208. players = get_players();
  5209. for( i = 0; i < players.size; i++ )
  5210. {
  5211. share_screen( players[i], false );
  5212. }
  5213. }
  5214. */
  5215.  
  5216. for ( j = 0; j < get_players().size; j++ )
  5217. {
  5218. player = get_players()[j];
  5219. player CameraActivate( false );
  5220.  
  5221. survived[j] Destroy();
  5222. game_over[j] Destroy();
  5223. }
  5224.  
  5225. if ( level.onlineGame || level.systemLink )
  5226. {
  5227. ExitLevel( false );
  5228. }
  5229. else
  5230. {
  5231. MissionFailed();
  5232. }
  5233.  
  5234. // Let's not exit the function
  5235. wait( 666 );
  5236. }
  5237.  
  5238. update_leaderboards()
  5239. {
  5240. uploadGlobalStatCounters();
  5241.  
  5242. if ( GetPlayers().size <= 1 )
  5243. {
  5244. //Solo leaderboard!
  5245. cheater_found = maps\_zombiemode_ffotd::nazizombies_checking_for_cheats();
  5246. if( cheater_found == false )
  5247. {
  5248. //no cheater found - upload score and stats
  5249. nazizombies_upload_solo_highscore();
  5250. }
  5251. return;
  5252. }
  5253.  
  5254. if( level.systemLink )
  5255. {
  5256. return;
  5257. }
  5258.  
  5259. if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size )
  5260. {
  5261. return;
  5262. }
  5263.  
  5264. cheater_found = maps\_zombiemode_ffotd::nazizombies_checking_for_cheats();
  5265. if( cheater_found == false )
  5266. {
  5267. //no cheater found - upload score and stats
  5268. nazizombies_upload_highscore();
  5269. nazizombies_set_new_zombie_stats();
  5270. }
  5271. }
  5272.  
  5273. initializeStatTracking()
  5274. {
  5275. level.global_zombies_killed = 0;
  5276. }
  5277.  
  5278. uploadGlobalStatCounters()
  5279. {
  5280. incrementCounter( "global_zombies_killed", level.global_zombies_killed );
  5281. incrementCounter( "global_zombies_killed_by_players", level.zombie_player_killed_count );
  5282. incrementCounter( "global_zombies_killed_by_traps", level.zombie_trap_killed_count );
  5283. }
  5284.  
  5285. player_fake_death()
  5286. {
  5287. level notify ("fake_death");
  5288. self notify ("fake_death");
  5289.  
  5290. self TakeAllWeapons();
  5291. self AllowProne( true );
  5292. self AllowStand( false );
  5293. self AllowCrouch( false );
  5294.  
  5295. self.ignoreme = true;
  5296. self EnableInvulnerability();
  5297.  
  5298. wait( 1 );
  5299. self FreezeControls( true );
  5300. }
  5301.  
  5302. player_exit_level()
  5303. {
  5304. self AllowStand( true );
  5305. self AllowCrouch( false );
  5306. self AllowProne( false );
  5307.  
  5308. if( IsDefined( self.game_over_bg ) )
  5309. {
  5310. self.game_over_bg.foreground = true;
  5311. self.game_over_bg.sort = 100;
  5312. self.game_over_bg FadeOverTime( 1 );
  5313. self.game_over_bg.alpha = 1;
  5314. }
  5315. }
  5316.  
  5317. player_killed_override()
  5318. {
  5319. // BLANK
  5320. level waittill( "forever" );
  5321. }
  5322.  
  5323.  
  5324. injured_walk()
  5325. {
  5326. self.ground_ref_ent = Spawn( "script_model", ( 0, 0, 0 ) );
  5327.  
  5328. self.player_speed = 50;
  5329.  
  5330. // TODO do death countdown
  5331. self AllowSprint( false );
  5332. self AllowProne( false );
  5333. self AllowCrouch( false );
  5334. self AllowAds( false );
  5335. self AllowJump( false );
  5336.  
  5337. self PlayerSetGroundReferenceEnt( self.ground_ref_ent );
  5338. self thread limp();
  5339. }
  5340.  
  5341. limp()
  5342. {
  5343. level endon( "disconnect" );
  5344. level endon( "death" );
  5345. // TODO uncomment when/if SetBlur works again
  5346. //self thread player_random_blur();
  5347.  
  5348. stumble = 0;
  5349. alt = 0;
  5350.  
  5351. while( 1 )
  5352. {
  5353. velocity = self GetVelocity();
  5354. player_speed = abs( velocity[0] ) + abs( velocity[1] );
  5355.  
  5356. if( player_speed < 10 )
  5357. {
  5358. wait( 0.05 );
  5359. continue;
  5360. }
  5361.  
  5362. speed_multiplier = player_speed / self.player_speed;
  5363.  
  5364. p = RandomFloatRange( 3, 5 );
  5365. if( RandomInt( 100 ) < 20 )
  5366. {
  5367. p *= 3;
  5368. }
  5369. r = RandomFloatRange( 3, 7 );
  5370. y = RandomFloatRange( -8, -2 );
  5371.  
  5372. stumble_angles = ( p, y, r );
  5373. stumble_angles = vector_scale( stumble_angles, speed_multiplier );
  5374.  
  5375. stumble_time = RandomFloatRange( .35, .45 );
  5376. recover_time = RandomFloatRange( .65, .8 );
  5377.  
  5378. stumble++;
  5379. if( speed_multiplier > 1.3 )
  5380. {
  5381. stumble++;
  5382. }
  5383.  
  5384. self thread stumble( stumble_angles, stumble_time, recover_time );
  5385.  
  5386. level waittill( "recovered" );
  5387. }
  5388. }
  5389.  
  5390. stumble( stumble_angles, stumble_time, recover_time, no_notify )
  5391. {
  5392. stumble_angles = self adjust_angles_to_player( stumble_angles );
  5393.  
  5394. self.ground_ref_ent RotateTo( stumble_angles, stumble_time, ( stumble_time/4*3 ), ( stumble_time/4 ) );
  5395. self.ground_ref_ent waittill( "rotatedone" );
  5396.  
  5397. base_angles = ( RandomFloat( 4 ) - 4, RandomFloat( 5 ), 0 );
  5398. base_angles = self adjust_angles_to_player( base_angles );
  5399.  
  5400. self.ground_ref_ent RotateTo( base_angles, recover_time, 0, ( recover_time / 2 ) );
  5401. self.ground_ref_ent waittill( "rotatedone" );
  5402.  
  5403. if( !IsDefined( no_notify ) )
  5404. {
  5405. level notify( "recovered" );
  5406. }
  5407. }
  5408.  
  5409. adjust_angles_to_player( stumble_angles )
  5410. {
  5411. pa = stumble_angles[0];
  5412. ra = stumble_angles[2];
  5413.  
  5414. rv = AnglesToRight( self.angles );
  5415. fv = AnglesToForward( self.angles );
  5416.  
  5417. rva = ( rv[0], 0, rv[1]*-1 );
  5418. fva = ( fv[0], 0, fv[1]*-1 );
  5419. angles = vector_scale( rva, pa );
  5420. angles = angles + vector_scale( fva, ra );
  5421. return angles +( 0, stumble_angles[1], 0 );
  5422. }
  5423.  
  5424. coop_player_spawn_placement()
  5425. {
  5426. structs = getstructarray( "initial_spawn_points", "targetname" );
  5427.  
  5428. temp_ent = Spawn( "script_model", (0,0,0) );
  5429. for( i = 0; i < structs.size; i++ )
  5430. {
  5431. temp_ent.origin = structs[i].origin;
  5432. temp_ent placeSpawnpoint();
  5433. structs[i].origin = temp_ent.origin;
  5434. }
  5435. temp_ent Delete();
  5436.  
  5437. flag_wait( "all_players_connected" );
  5438.  
  5439. //chrisp - adding support for overriding the default spawning method
  5440.  
  5441. players = get_players();
  5442.  
  5443. for( i = 0; i < players.size; i++ )
  5444. {
  5445. players[i] setorigin( structs[i].origin );
  5446. players[i] setplayerangles( structs[i].angles );
  5447. players[i].spectator_respawn = structs[i];
  5448. }
  5449. }
  5450.  
  5451.  
  5452. player_zombie_breadcrumb()
  5453. {
  5454. self endon( "disconnect" );
  5455. self endon( "spawned_spectator" );
  5456. level endon( "intermission" );
  5457.  
  5458. self.zombie_breadcrumbs = [];
  5459. self.zombie_breadcrumb_distance = 24 * 24; // min dist (squared) the player must move to drop a crumb
  5460. self.zombie_breadcrumb_area_num = 3; // the number of "rings" the area breadcrumbs use
  5461. self.zombie_breadcrumb_area_distance = 16; // the distance between each "ring" of the area breadcrumbs
  5462.  
  5463. self store_crumb( self.origin );
  5464. last_crumb = self.origin;
  5465.  
  5466. self thread debug_breadcrumbs();
  5467.  
  5468. while( 1 )
  5469. {
  5470. wait_time = 0.1;
  5471.  
  5472. /#
  5473. if( self isnotarget() )
  5474. {
  5475. wait( wait_time );
  5476. continue;
  5477. }
  5478. #/
  5479.  
  5480. //For cloaking ability
  5481. //if( self.ignoreme )
  5482. //{
  5483. // wait( wait_time );
  5484. // continue;
  5485. //}
  5486.  
  5487.  
  5488. store_crumb = true;
  5489. airborne = false;
  5490. crumb = self.origin;
  5491.  
  5492. //TODO TEMP SCRIPT for vehicle testing Delete/comment when done
  5493. if ( !self IsOnGround() && self isinvehicle() )
  5494. {
  5495. trace = bullettrace( self.origin + (0,0,10), self.origin, false, undefined );
  5496. crumb = trace["position"];
  5497. }
  5498.  
  5499. //TODO TEMP DISABLE for vehicle testing. Uncomment when reverting
  5500. // if ( !self IsOnGround() )
  5501. // {
  5502. // airborne = true;
  5503. // store_crumb = false;
  5504. // wait_time = 0.05;
  5505. // }
  5506. //
  5507. if( !airborne && DistanceSquared( crumb, last_crumb ) < self.zombie_breadcrumb_distance )
  5508. {
  5509. store_crumb = false;
  5510. }
  5511.  
  5512. if ( airborne && self IsOnGround() )
  5513. {
  5514. // player was airborne, store crumb now that he's on the ground
  5515. store_crumb = true;
  5516. airborne = false;
  5517. }
  5518.  
  5519. if( isDefined( level.custom_breadcrumb_store_func ) )
  5520. {
  5521. store_crumb = self [[ level.custom_breadcrumb_store_func ]]( store_crumb );
  5522. }
  5523.  
  5524. if( isDefined( level.custom_airborne_func ) )
  5525. {
  5526. airborne = self [[ level.custom_airborne_func ]]( airborne );
  5527. }
  5528.  
  5529. if( store_crumb )
  5530. {
  5531. debug_print( "Player is storing breadcrumb " + crumb );
  5532.  
  5533. if( IsDefined(self.node) )
  5534. {
  5535. debug_print( "has closest node " );
  5536. }
  5537.  
  5538. last_crumb = crumb;
  5539. self store_crumb( crumb );
  5540. }
  5541.  
  5542. wait( wait_time );
  5543. }
  5544. }
  5545.  
  5546.  
  5547. store_crumb( origin )
  5548. {
  5549. offsets = [];
  5550. height_offset = 32;
  5551.  
  5552. index = 0;
  5553. for( j = 1; j <= self.zombie_breadcrumb_area_num; j++ )
  5554. {
  5555. offset = ( j * self.zombie_breadcrumb_area_distance );
  5556.  
  5557. offsets[0] = ( origin[0] - offset, origin[1], origin[2] );
  5558. offsets[1] = ( origin[0] + offset, origin[1], origin[2] );
  5559. offsets[2] = ( origin[0], origin[1] - offset, origin[2] );
  5560. offsets[3] = ( origin[0], origin[1] + offset, origin[2] );
  5561.  
  5562. offsets[4] = ( origin[0] - offset, origin[1], origin[2] + height_offset );
  5563. offsets[5] = ( origin[0] + offset, origin[1], origin[2] + height_offset );
  5564. offsets[6] = ( origin[0], origin[1] - offset, origin[2] + height_offset );
  5565. offsets[7] = ( origin[0], origin[1] + offset, origin[2] + height_offset );
  5566.  
  5567. for ( i = 0; i < offsets.size; i++ )
  5568. {
  5569. self.zombie_breadcrumbs[index] = offsets[i];
  5570. index++;
  5571. }
  5572. }
  5573. }
  5574.  
  5575.  
  5576. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  5577. /////////////////////////////////////////////////LEADERBOARD CODE///////////////////////////////////////////////////////////
  5578. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  5579. to_mins( seconds )
  5580. {
  5581. hours = 0;
  5582. minutes = 0;
  5583.  
  5584. if( seconds > 59 )
  5585. {
  5586. minutes = int( seconds / 60 );
  5587.  
  5588. seconds = int( seconds * 1000 ) % ( 60 * 1000 );
  5589. seconds = seconds * 0.001;
  5590.  
  5591. if( minutes > 59 )
  5592. {
  5593. hours = int( minutes / 60 );
  5594. minutes = int( minutes * 1000 ) % ( 60 * 1000 );
  5595. minutes = minutes * 0.001;
  5596. }
  5597. }
  5598.  
  5599. if( hours < 10 )
  5600. {
  5601. hours = "0" + hours;
  5602. }
  5603.  
  5604. if( minutes < 10 )
  5605. {
  5606. minutes = "0" + minutes;
  5607. }
  5608.  
  5609. seconds = Int( seconds );
  5610. if( seconds < 10 )
  5611. {
  5612. seconds = "0" + seconds;
  5613. }
  5614.  
  5615. combined = "" + hours + ":" + minutes + ":" + seconds;
  5616.  
  5617. return combined;
  5618. }
  5619.  
  5620. //This is used to upload the score to the solo leaderboard for the moon map(No Man's Land)
  5621. nazizombies_upload_solo_highscore()
  5622. {
  5623. map_name = GetDvar( #"mapname" );
  5624.  
  5625. if ( !isZombieLeaderboardAvailable( map_name, "kills" ) )
  5626. return;
  5627.  
  5628. players = get_players();
  5629. for( i = 0; i < players.size; i++ )
  5630. {
  5631. if( map_name == "zombie_moon" )
  5632. {
  5633. nomanslandtime = level.nml_best_time;
  5634. nomansland_kills = level.nml_kills;
  5635. nomansland_score = level.nml_score;
  5636. player_survival_time = int( nomanslandtime/1000 );
  5637. total_score = nomansland_score; //players[i].score_total;
  5638. total_kills = nomansland_kills; //players[i].kills;
  5639.  
  5640. leaderboard_number = getZombieLeaderboardNumber( map_name, "kills" );
  5641.  
  5642. rounds_survived = level.round_number;
  5643.  
  5644. if( isdefined(level.nml_didteleport) && (level.nml_didteleport==false) )
  5645. {
  5646. rounds_survived = 0;
  5647. }
  5648.  
  5649. /#
  5650. if( GetDvarInt( #"zombie_cheat" ) >= 1 )
  5651. {
  5652. level.devcheater = 1;
  5653. }
  5654.  
  5655. if( isdefined(level.devcheater) && level.devcheater )
  5656. {
  5657. rounds_survived = -1;
  5658. }
  5659. #/
  5660.  
  5661. rankNumber = makeNMLRankNumberSolo( total_kills, total_score );
  5662. if( !isdefined(level.round_number) )
  5663. {
  5664. level.round_number = 0;
  5665. }
  5666.  
  5667. if( !isdefined(level.nml_pap) )
  5668. {
  5669. level.nml_pap = 0;
  5670. }
  5671. if( !isdefined(level.nml_speed) )
  5672. {
  5673. level.nml_speed = 0;
  5674. }
  5675. if( !isdefined(level.nml_jugg) )
  5676. {
  5677. level.nml_jugg = 0;
  5678. }
  5679.  
  5680.  
  5681. if( !isdefined(level.sololb_build_number) )
  5682. {
  5683. level.sololb_build_number = 48;
  5684. }
  5685.  
  5686. players[i] UploadScore( leaderboard_number, int(rankNumber), total_kills, total_score, player_survival_time, rounds_survived, level.sololb_build_number, level.nml_pap, level.nml_speed, level.nml_jugg );
  5687. }
  5688. }
  5689. }
  5690.  
  5691. makeNMLRankNumberSolo( total_kills, total_score )
  5692. {
  5693. maximum_survival_time = 108000;
  5694.  
  5695. // Upper cap on total_kills is 2000
  5696. if( total_kills > 2000 )
  5697. total_kills = 2000;
  5698.  
  5699. // Upper cap on player total score
  5700. if( total_score > 99999 )
  5701. total_score = 99999;
  5702.  
  5703.  
  5704. //pad out ranking time.
  5705. score_padding = "";
  5706. if ( total_score < 10 )
  5707. score_padding += "0000";
  5708. else if( total_score < 100 )
  5709. score_padding += "000";
  5710. else if( total_score < 1000 )
  5711. score_padding += "00";
  5712. else if( total_score < 10000 )
  5713. score_padding += "0";
  5714.  
  5715. // Trying to make the rankNumber by combining kills with 5 digit padded points earned.
  5716. rankNumber = total_kills + score_padding + total_score;
  5717.  
  5718. return rankNumber;
  5719. }
  5720.  
  5721. //CODER MOD: TOMMY K
  5722. nazizombies_upload_highscore()
  5723. {
  5724. // Nazi Zombie Leaderboards
  5725. // nazi_zombie_prototype_waves = 13
  5726. // nazi_zombie_prototype_points = 14
  5727.  
  5728. // this has gotta be the dumbest way of doing this, but at 1:33am in the morning my brain is fried!
  5729. playersRank = 1;
  5730. if( level.players_playing == 1 )
  5731. playersRank = 4;
  5732. else if( level.players_playing == 2 )
  5733. playersRank = 3;
  5734. else if( level.players_playing == 3 )
  5735. playersRank = 2;
  5736.  
  5737. map_name = GetDvar( #"mapname" );
  5738.  
  5739. if ( !isZombieLeaderboardAvailable( map_name, "waves" ) || !isZombieLeaderboardAvailable( map_name, "points" ) )
  5740. return;
  5741.  
  5742. players = get_players();
  5743. for( i = 0; i < players.size; i++ )
  5744. {
  5745. pre_highest_wave = players[i] playerZombieStatGet( map_name, "highestwave" );
  5746. pre_time_in_wave = players[i] playerZombieStatGet( map_name, "timeinwave" );
  5747.  
  5748. new_highest_wave = level.round_number + "" + playersRank;
  5749. new_highest_wave = int( new_highest_wave );
  5750.  
  5751. if( new_highest_wave >= pre_highest_wave )
  5752. {
  5753. if( players[i].zombification_time == 0 )
  5754. {
  5755. players[i].zombification_time = GetTime();
  5756. }
  5757.  
  5758. player_survival_time = players[i].zombification_time - level.round_start_time;
  5759. player_survival_time = int( player_survival_time/1000 );
  5760.  
  5761. /*
  5762. if( map_name == "zombie_moon" )
  5763. {
  5764. nomanslandtime = level.nml_best_time ;
  5765. player_survival_time = int( nomanslandtime/1000 );
  5766. //player_survival_time_in_mins = maps\_zombiemode::to_mins( player_survival_time );
  5767. //IPrintLnBold( "NO MANS LAND = " + player_survival_time_in_mins );
  5768. }
  5769. */
  5770.  
  5771. if( new_highest_wave > pre_highest_wave || player_survival_time > pre_time_in_wave )
  5772. {
  5773. rankNumber = makeRankNumber( level.round_number, playersRank, player_survival_time );
  5774.  
  5775. leaderboard_number = getZombieLeaderboardNumber( map_name, "waves" );
  5776.  
  5777. players[i] UploadScore( leaderboard_number, int(rankNumber), level.round_number, player_survival_time, level.players_playing );
  5778. //players[i] UploadScore( leaderboard_number, int(rankNumber), level.round_number );
  5779.  
  5780. players[i] playerZombieStatSet( map_name, "highestwave", new_highest_wave );
  5781. players[i] playerZombieStatSet( map_name, "timeinwave", player_survival_time );
  5782. }
  5783. }
  5784.  
  5785. pre_total_points = players[i] playerZombieStatGet( map_name, "totalpoints" );
  5786. if( players[i].score_total > pre_total_points )
  5787. {
  5788. leaderboard_number = getZombieLeaderboardNumber( map_name, "points" );
  5789.  
  5790. players[i] UploadScore( leaderboard_number, players[i].score_total, players[i].kills, level.players_playing );
  5791.  
  5792. players[i] playerZombieStatSet( map_name, "totalpoints", players[i].score_total );
  5793. }
  5794. }
  5795. }
  5796.  
  5797. isZombieLeaderboardAvailable( map, type )
  5798. {
  5799. if ( !isDefined( level.zombieLeaderboardNumber[map] ) )
  5800. return 0;
  5801.  
  5802. if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) )
  5803. return 0;
  5804.  
  5805. return 1;
  5806. }
  5807.  
  5808. getZombieLeaderboardNumber( map, type )
  5809. {
  5810. if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) )
  5811. assertMsg( "Unknown leaderboard number for map " + map + "and type " + type );
  5812.  
  5813. return level.zombieLeaderboardNumber[map][type];
  5814. }
  5815.  
  5816. getZombieStatVariable( map, variable )
  5817. {
  5818. if ( !isDefined( level.zombieLeaderboardStatVariable[map][variable] ) )
  5819. assertMsg( "Unknown stat variable " + variable + " for map " + map );
  5820.  
  5821. return level.zombieLeaderboardStatVariable[map][variable];
  5822. }
  5823.  
  5824. playerZombieStatGet( map, variable )
  5825. {
  5826. stat_variable = getZombieStatVariable( map, variable );
  5827. result = self zombieStatGet( stat_variable );
  5828.  
  5829. return result;
  5830. }
  5831.  
  5832. playerZombieStatSet( map, variable, value )
  5833. {
  5834. stat_variable = getZombieStatVariable( map, variable );
  5835. self zombieStatSet( stat_variable, value );
  5836. }
  5837.  
  5838. nazizombies_set_new_zombie_stats()
  5839. {
  5840. players = get_players();
  5841. for( i = 0; i < players.size; i++ )
  5842. {
  5843. //grab stat and add final totals
  5844. total_kills = players[i] zombieStatGet( "zombie_kills" ) + players[i].stats["kills"];
  5845. total_points = players[i] zombieStatGet( "zombie_points" ) + players[i].stats["score"];
  5846. total_rounds = players[i] zombieStatGet( "zombie_rounds" ) + (level.round_number - 1); // rounds survived
  5847. total_downs = players[i] zombieStatGet( "zombie_downs" ) + players[i].stats["downs"];
  5848. total_revives = players[i] zombieStatGet( "zombie_revives" ) + players[i].stats["revives"];
  5849. total_perks = players[i] zombieStatGet( "zombie_perks_consumed" ) + players[i].stats["perks"];
  5850. total_headshots = players[i] zombieStatGet( "zombie_heashots" ) + players[i].stats["headshots"];
  5851. total_zombie_gibs = players[i] zombieStatGet( "zombie_gibs" ) + players[i].stats["zombie_gibs"];
  5852.  
  5853. //set zombie stats
  5854. players[i] zombieStatSet( "zombie_kills", total_kills );
  5855. players[i] zombieStatSet( "zombie_points", total_points );
  5856. players[i] zombieStatSet( "zombie_rounds", total_rounds );
  5857. players[i] zombieStatSet( "zombie_downs", total_downs );
  5858. players[i] zombieStatSet( "zombie_revives", total_revives );
  5859. players[i] zombieStatSet( "zombie_perks_consumed", total_perks );
  5860. players[i] zombieStatSet( "zombie_heashots", total_headshots );
  5861. players[i] zombieStatSet( "zombie_gibs", total_zombie_gibs );
  5862. }
  5863. }
  5864.  
  5865. makeRankNumber( wave, players, time )
  5866. {
  5867. if( time > 86400 )
  5868. time = 86400; // cap it at like 1 day, need to cap cause you know some muppet is gonna end up trying it
  5869.  
  5870. //pad out time
  5871. padding = "";
  5872. if ( 10 > time )
  5873. padding += "0000";
  5874. else if( 100 > time )
  5875. padding += "000";
  5876. else if( 1000 > time )
  5877. padding += "00";
  5878. else if( 10000 > time )
  5879. padding += "0";
  5880.  
  5881. rank = wave + "" + players + padding + time;
  5882.  
  5883. return rank;
  5884. }
  5885.  
  5886.  
  5887. //CODER MOD: TOMMY K
  5888. /*
  5889. =============
  5890. zombieStatGet
  5891.  
  5892. Returns the value of the named stat
  5893. =============
  5894. */
  5895. zombieStatGet( dataName )
  5896. {
  5897. if( level.systemLink )
  5898. {
  5899. return;
  5900. }
  5901. if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size )
  5902. {
  5903. return;
  5904. }
  5905.  
  5906. return ( self getdstat( "PlayerStatsList", dataName ) );
  5907. }
  5908.  
  5909. //CODER MOD: TOMMY K
  5910. /*
  5911. =============
  5912. zombieStatSet
  5913.  
  5914. Sets the value of the named stat
  5915. =============
  5916. */
  5917. zombieStatSet( dataName, value )
  5918. {
  5919. if( level.systemLink )
  5920. {
  5921. return;
  5922. }
  5923. if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size )
  5924. {
  5925. return;
  5926. }
  5927.  
  5928. self setdstat( "PlayerStatsList", dataName, value );
  5929. }
  5930.  
  5931.  
  5932. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  5933. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  5934. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  5935.  
  5936. //
  5937. // INTERMISSION =========================================================== //
  5938. //
  5939.  
  5940. intermission()
  5941. {
  5942. level.intermission = true;
  5943. level notify( "intermission" );
  5944.  
  5945. players = get_players();
  5946. for( i = 0; i < players.size; i++ )
  5947. {
  5948. setclientsysstate( "levelNotify", "zi", players[i] ); // Tell clientscripts we're in zombie intermission
  5949.  
  5950. players[i] SetClientDvars( "cg_thirdPerson", "0",
  5951. "cg_fov", "65" );
  5952.  
  5953. players[i].health = 100; // This is needed so the player view doesn't get stuck
  5954. players[i] thread [[level.custom_intermission]]();
  5955. }
  5956.  
  5957. wait( 0.25 );
  5958.  
  5959. // Delay the last stand monitor so we are 100% sure the zombie intermission ("zi") is set on the cients
  5960. players = get_players();
  5961. for( i = 0; i < players.size; i++ )
  5962. {
  5963. setClientSysState( "lsm", "0", players[i] );
  5964. }
  5965.  
  5966. visionset = "zombie";
  5967. if( IsDefined( level.zombie_vars["intermission_visionset"] ) )
  5968. {
  5969. visionset = level.zombie_vars["intermission_visionset"];
  5970. }
  5971.  
  5972. level thread maps\_utility::set_all_players_visionset( visionset, 2 );
  5973. level thread zombie_game_over_death();
  5974. }
  5975.  
  5976. zombie_game_over_death()
  5977. {
  5978. // Kill remaining zombies, in style!
  5979. zombies = GetAiArray( "axis" );
  5980. for( i = 0; i < zombies.size; i++ )
  5981. {
  5982. if( !IsAlive( zombies[i] ) )
  5983. {
  5984. continue;
  5985. }
  5986.  
  5987. zombies[i] SetGoalPos( zombies[i].origin );
  5988. }
  5989.  
  5990. for( i = 0; i < zombies.size; i++ )
  5991. {
  5992. if( !IsAlive( zombies[i] ) )
  5993. {
  5994. continue;
  5995. }
  5996.  
  5997. wait( 0.5 + RandomFloat( 2 ) );
  5998.  
  5999. if ( isdefined( zombies[i] ) )
  6000. {
  6001. zombies[i] maps\_zombiemode_spawner::zombie_head_gib();
  6002. zombies[i] DoDamage( zombies[i].health + 666, zombies[i].origin );
  6003. }
  6004. }
  6005. }
  6006.  
  6007. player_intermission()
  6008. {
  6009. self closeMenu();
  6010. self closeInGameMenu();
  6011.  
  6012. level endon( "stop_intermission" );
  6013. self endon("disconnect");
  6014. self endon("death");
  6015. self notify( "_zombie_game_over" ); // ww: notify so hud elements know when to leave
  6016.  
  6017. //Show total gained point for end scoreboard and lobby
  6018. self.score = self.score_total;
  6019.  
  6020. self.sessionstate = "intermission";
  6021. self.spectatorclient = -1;
  6022. self.killcamentity = -1;
  6023. self.archivetime = 0;
  6024. self.psoffsettime = 0;
  6025. self.friendlydamage = undefined;
  6026.  
  6027. points = getstructarray( "intermission", "targetname" );
  6028.  
  6029. if( !IsDefined( points ) || points.size == 0 )
  6030. {
  6031. points = getentarray( "info_intermission", "classname" );
  6032. if( points.size < 1 )
  6033. {
  6034. println( "NO info_intermission POINTS IN MAP" );
  6035. return;
  6036. }
  6037. }
  6038.  
  6039. self.game_over_bg = NewClientHudelem( self );
  6040. self.game_over_bg.horzAlign = "fullscreen";
  6041. self.game_over_bg.vertAlign = "fullscreen";
  6042. self.game_over_bg SetShader( "black", 640, 480 );
  6043. self.game_over_bg.alpha = 1;
  6044.  
  6045. org = undefined;
  6046. while( 1 )
  6047. {
  6048. points = array_randomize( points );
  6049. for( i = 0; i < points.size; i++ )
  6050. {
  6051. point = points[i];
  6052. // Only spawn once if we are using 'moving' org
  6053. // If only using info_intermissions, this will respawn after 5 seconds.
  6054. if( !IsDefined( org ) )
  6055. {
  6056. self Spawn( point.origin, point.angles );
  6057. }
  6058.  
  6059. // Only used with STRUCTS
  6060. if( IsDefined( points[i].target ) )
  6061. {
  6062. if( !IsDefined( org ) )
  6063. {
  6064. org = Spawn( "script_model", self.origin + ( 0, 0, -60 ) );
  6065. org SetModel("tag_origin");
  6066. }
  6067.  
  6068. // self LinkTo( org, "", ( 0, 0, -60 ), ( 0, 0, 0 ) );
  6069. // self SetPlayerAngles( points[i].angles );
  6070. org.origin = points[i].origin;
  6071. org.angles = points[i].angles;
  6072.  
  6073.  
  6074. for ( j = 0; j < get_players().size; j++ )
  6075. {
  6076. player = get_players()[j];
  6077. player CameraSetPosition( org );
  6078. player CameraSetLookAt();
  6079. player CameraActivate( true );
  6080. }
  6081.  
  6082. speed = 20;
  6083. if( IsDefined( points[i].speed ) )
  6084. {
  6085. speed = points[i].speed;
  6086. }
  6087.  
  6088. target_point = getstruct( points[i].target, "targetname" );
  6089. dist = Distance( points[i].origin, target_point.origin );
  6090. time = dist / speed;
  6091.  
  6092. q_time = time * 0.25;
  6093. if( q_time > 1 )
  6094. {
  6095. q_time = 1;
  6096. }
  6097.  
  6098. self.game_over_bg FadeOverTime( q_time );
  6099. self.game_over_bg.alpha = 0;
  6100.  
  6101. org MoveTo( target_point.origin, time, q_time, q_time );
  6102. org RotateTo( target_point.angles, time, q_time, q_time );
  6103. wait( time - q_time );
  6104.  
  6105. self.game_over_bg FadeOverTime( q_time );
  6106. self.game_over_bg.alpha = 1;
  6107.  
  6108. wait( q_time );
  6109. }
  6110. else
  6111. {
  6112. self.game_over_bg FadeOverTime( 1 );
  6113. self.game_over_bg.alpha = 0;
  6114.  
  6115. wait( 5 );
  6116.  
  6117. self.game_over_bg thread fade_up_over_time(1);
  6118.  
  6119. //wait( 1 );
  6120. }
  6121. }
  6122. }
  6123. }
  6124.  
  6125. fade_up_over_time(t)
  6126. {
  6127. self FadeOverTime( t );
  6128. self.alpha = 1;
  6129. }
  6130.  
  6131. prevent_near_origin()
  6132. {
  6133. while (1)
  6134. {
  6135. players = get_players();
  6136.  
  6137. for (i = 0; i < players.size; i++)
  6138. {
  6139. for (q = 0; q < players.size; q++)
  6140. {
  6141. if (players[i] != players[q])
  6142. {
  6143. if (check_to_kill_near_origin(players[i], players[q]))
  6144. {
  6145. p1_org = players[i].origin;
  6146. p2_org = players[q].origin;
  6147.  
  6148. wait 5;
  6149.  
  6150. if (check_to_kill_near_origin(players[i], players[q]))
  6151. {
  6152. if ( (distance(players[i].origin, p1_org) < 30) && distance(players[q].origin, p2_org) < 30)
  6153. {
  6154. setsaveddvar("player_deathInvulnerableTime", 0);
  6155. players[i] DoDamage( players[i].health + 1000, players[i].origin, undefined, undefined, "riflebullet" );
  6156. setsaveddvar("player_deathInvulnerableTime", level.startInvulnerableTime);
  6157. }
  6158. }
  6159. }
  6160. }
  6161. }
  6162. }
  6163.  
  6164. wait 0.2;
  6165. }
  6166. }
  6167.  
  6168. check_to_kill_near_origin(player1, player2)
  6169. {
  6170. if (!isdefined(player1) || !isdefined(player2))
  6171. {
  6172. return false;
  6173. }
  6174.  
  6175. if (distance(player1.origin, player2.origin) > 12)
  6176. {
  6177. return false;
  6178. }
  6179.  
  6180. if ( player1 maps\_laststand::player_is_in_laststand() || player2 maps\_laststand::player_is_in_laststand() )
  6181. {
  6182. return false;
  6183. }
  6184.  
  6185. if (!isalive(player1) || !isalive(player2))
  6186. {
  6187. return false;
  6188. }
  6189.  
  6190. return true;
  6191. }
  6192.  
  6193.  
  6194. //
  6195. crawler_round_tracker()
  6196. {
  6197. level.crawler_round_count = 1;
  6198.  
  6199. level.next_crawler_round = 4;
  6200.  
  6201. sav_func = level.round_spawn_func;
  6202. while ( 1 )
  6203. {
  6204. level waittill ( "between_round_over" );
  6205.  
  6206. /#
  6207. if( GetDvarInt( #"force_crawlers" ) > 0 )
  6208. {
  6209. next_crawler_round = level.round_number;
  6210. }
  6211. #/
  6212.  
  6213. if ( level.round_number == level.next_crawler_round )
  6214. {
  6215. sav_func = level.round_spawn_func;
  6216. crawler_round_start();
  6217. level.round_spawn_func = ::round_spawning;
  6218.  
  6219. if ( IsDefined( level.next_dog_round ) )
  6220. {
  6221. level.next_crawler_round = level.next_dog_round + randomintrange( 2, 3 );
  6222. }
  6223. else
  6224. {
  6225. level.next_crawler_round = randomintrange( 4, 6 );
  6226. }
  6227. /#
  6228. get_players()[0] iprintln( "Next crawler round: " + level.next_crawler_round );
  6229. #/
  6230. }
  6231. else if ( flag( "crawler_round" ) )
  6232. {
  6233. crawler_round_stop();
  6234.  
  6235. // Don't trample over the round_spawn_func setting
  6236. if ( IsDefined( level.next_dog_round ) &&
  6237. level.next_dog_round == level.round_number )
  6238. {
  6239. level.round_spawn_func = sav_func;
  6240. }
  6241.  
  6242. level.crawler_round_count += 1;
  6243. }
  6244. }
  6245. }
  6246.  
  6247.  
  6248. crawler_round_start()
  6249. {
  6250. flag_set( "crawler_round" );
  6251. if(!IsDefined (level.crawlerround_nomusic))
  6252. {
  6253. level.crawlerround_nomusic = 0;
  6254. }
  6255. level.crawlerround_nomusic = 1;
  6256. level notify( "crawler_round_starting" );
  6257. clientnotify( "crawler_start" );
  6258. }
  6259.  
  6260.  
  6261. crawler_round_stop()
  6262. {
  6263. flag_clear( "crawler_round" );
  6264.  
  6265. if(!IsDefined (level.crawlerround_nomusic))
  6266. {
  6267. level.crawlerround_nomusic = 0;
  6268. }
  6269. level.crawlerround_nomusic = 0;
  6270. level notify( "crawler_round_ending" );
  6271. clientnotify( "crawler_stop" );
  6272. }
  6273.  
  6274. default_exit_level()
  6275. {
  6276. zombies = GetAiArray( "axis" );
  6277. for ( i = 0; i < zombies.size; i++ )
  6278. {
  6279. if ( is_true( zombies[i].ignore_solo_last_stand ) )
  6280. {
  6281. continue;
  6282. }
  6283.  
  6284. if ( isDefined( zombies[i].find_exit_point ) )
  6285. {
  6286. zombies[i] thread [[ zombies[i].find_exit_point ]]();
  6287. continue;
  6288. }
  6289.  
  6290. if ( zombies[i].ignoreme )
  6291. {
  6292. zombies[i] thread default_delayed_exit();
  6293. }
  6294. else
  6295. {
  6296. zombies[i] thread default_find_exit_point();
  6297. }
  6298. }
  6299. }
  6300.  
  6301. default_delayed_exit()
  6302. {
  6303. self endon( "death" );
  6304.  
  6305. while ( 1 )
  6306. {
  6307. if ( !flag( "wait_and_revive" ) )
  6308. {
  6309. return;
  6310. }
  6311.  
  6312. // broke through the barricade, find an exit point
  6313. if ( !self.ignoreme )
  6314. {
  6315. break;
  6316. }
  6317. wait_network_frame();
  6318. }
  6319.  
  6320. self thread default_find_exit_point();
  6321. }
  6322.  
  6323. default_find_exit_point()
  6324. {
  6325. self endon( "death" );
  6326.  
  6327. player = getplayers()[0];
  6328.  
  6329. dist_zombie = 0;
  6330. dist_player = 0;
  6331. dest = 0;
  6332.  
  6333. away = VectorNormalize( self.origin - player.origin );
  6334. endPos = self.origin + vector_scale( away, 600 );
  6335.  
  6336. locs = array_randomize( level.enemy_dog_locations );
  6337.  
  6338. for ( i = 0; i < locs.size; i++ )
  6339. {
  6340. dist_zombie = DistanceSquared( locs[i].origin, endPos );
  6341. dist_player = DistanceSquared( locs[i].origin, player.origin );
  6342.  
  6343. if ( dist_zombie < dist_player )
  6344. {
  6345. dest = i;
  6346. break;
  6347. }
  6348. }
  6349.  
  6350. self notify( "stop_find_flesh" );
  6351. self notify( "zombie_acquire_enemy" );
  6352.  
  6353. self setgoalpos( locs[dest].origin );
  6354.  
  6355. while ( 1 )
  6356. {
  6357. if ( !flag( "wait_and_revive" ) )
  6358. {
  6359. break;
  6360. }
  6361. wait_network_frame();
  6362. }
  6363.  
  6364. self thread maps\_zombiemode_spawner::find_flesh();
  6365. }
  6366.  
  6367. play_level_start_vox_delayed()
  6368. {
  6369. wait(5);
  6370. players = getplayers();
  6371. num = RandomIntRange( 0, players.size );
  6372. players[num] maps\_zombiemode_audio::create_and_play_dialog( "general", "intro" );
  6373. }
  6374.  
  6375.  
  6376. //show some stats on the screen ( debug only )
  6377. init_screen_stats()
  6378. {
  6379.  
  6380. level.zombies_timeout_spawn_info = NewHudElem();
  6381. level.zombies_timeout_spawn_info.alignX = "right";
  6382. level.zombies_timeout_spawn_info.x = 100;
  6383. level.zombies_timeout_spawn_info.y = 80;
  6384. level.zombies_timeout_spawn_info.label = "Timeout(Spawncloset): ";
  6385. level.zombies_timeout_spawn_info.fontscale = 1.2;
  6386.  
  6387.  
  6388. level.zombies_timeout_playspace_info = NewHudElem();
  6389. level.zombies_timeout_playspace_info.alignX = "right";
  6390. level.zombies_timeout_playspace_info.x = 100;
  6391. level.zombies_timeout_playspace_info.y = 95;
  6392. level.zombies_timeout_playspace_info.label ="Timeout(Playspace): ";
  6393. level.zombies_timeout_playspace_info.fontscale = 1.2;
  6394.  
  6395. level.zombie_player_killed_count_info = NewHudElem();
  6396. level.zombie_player_killed_count_info.alignX = "right";
  6397. level.zombie_player_killed_count_info.x = 100;
  6398. level.zombie_player_killed_count_info.y = 110;
  6399. level.zombie_player_killed_count_info.label = "Zombies killed by players: ";
  6400. level.zombie_player_killed_count_info.fontscale = 1.2;
  6401.  
  6402. level.zombie_trap_killed_count_info = NewHudElem();
  6403. level.zombie_trap_killed_count_info.alignX = "right";
  6404. level.zombie_trap_killed_count_info.x = 100;
  6405. level.zombie_trap_killed_count_info.y = 125;
  6406. level.zombie_trap_killed_count_info.label = "Zombies killed by traps: ";
  6407. level.zombie_trap_killed_count_info.fontscale = 1.2;
  6408.  
  6409. level.zombie_pathing_failed_info = NewHudElem();
  6410. level.zombie_pathing_failed_info.alignX = "right";
  6411. level.zombie_pathing_failed_info.x = 100;
  6412. level.zombie_pathing_failed_info.y = 140;
  6413. level.zombie_pathing_failed_info.label = "Pathing failed: ";
  6414. level.zombie_pathing_failed_info.fontscale = 1.2;
  6415.  
  6416.  
  6417. level.zombie_breadcrumb_failed_info = NewHudElem();
  6418. level.zombie_breadcrumb_failed_info.alignX = "right";
  6419. level.zombie_breadcrumb_failed_info.x = 100;
  6420. level.zombie_breadcrumb_failed_info.y = 155;
  6421. level.zombie_breadcrumb_failed_info.label = "Breadcrumbs failed: ";
  6422. level.zombie_breadcrumb_failed_info.fontscale = 1.2;
  6423.  
  6424.  
  6425. level.player_0_distance_traveled_info = NewHudElem();
  6426. level.player_0_distance_traveled_info.alignX = "right";
  6427. level.player_0_distance_traveled_info.x = 100;
  6428. level.player_0_distance_traveled_info.y = 170;
  6429. level.player_0_distance_traveled_info.label = "Player(0) Distance traveled: ";
  6430. level.player_0_distance_traveled_info.fontscale = 1.2;
  6431.  
  6432. }
  6433.  
  6434. update_screen_stats()
  6435. {
  6436. flag_wait("all_players_spawned");
  6437. while(1)
  6438. {
  6439. wait(1);
  6440.  
  6441. if(getdvarint("zombie_show_stats") == 0)
  6442. {
  6443. level.zombies_timeout_spawn_info.alpha = 0;
  6444. level.zombies_timeout_playspace_info.alpha = 0;
  6445. level.zombie_player_killed_count_info.alpha = 0;
  6446. level.zombie_trap_killed_count_info.alpha = 0;
  6447. level.zombie_pathing_failed_info.alpha = 0;
  6448. level.zombie_breadcrumb_failed_info.alpha = 0;
  6449. level.player_0_distance_traveled_info.alpha = 0;
  6450. continue;
  6451. }
  6452. else
  6453. {
  6454. level.zombies_timeout_spawn_info.alpha = 1;
  6455. level.zombies_timeout_playspace_info.alpha = 1;
  6456. level.zombie_player_killed_count_info.alpha = 1;
  6457. level.zombie_trap_killed_count_info.alpha = 1;
  6458. level.zombie_pathing_failed_info.alpha = 1;
  6459. level.zombie_breadcrumb_failed_info.alpha = 1;
  6460. level.player_0_distance_traveled_info.alpha = 1;
  6461.  
  6462. level.zombies_timeout_spawn_info setValue( level.zombies_timeout_spawn );
  6463. level.zombies_timeout_playspace_info SetValue(level.zombies_timeout_playspace );
  6464. level.zombie_player_killed_count_info SetValue( level.zombie_player_killed_count);
  6465. level.zombie_trap_killed_count_info SetValue( level.zombie_trap_killed_count);
  6466. level.zombie_pathing_failed_info SetValue( level.zombie_pathing_failed );
  6467. level.zombie_breadcrumb_failed_info SetValue( level.zombie_breadcrumb_failed );
  6468. level.player_0_distance_traveled_info SetValue( get_players()[0].stats["distance_traveled"] );
  6469. }
  6470. }
  6471. }
  6472.  
  6473.  
  6474. register_sidequest( id, solo_stat, solo_collectible, coop_stat, coop_collectible )
  6475. {
  6476. if ( !IsDefined( level.zombie_sidequest_solo_stat ) )
  6477. {
  6478. level.zombie_sidequest_previously_completed = [];
  6479. level.zombie_sidequest_solo_stat = [];
  6480. level.zombie_sidequest_solo_collectible = [];
  6481. level.zombie_sidequest_coop_stat = [];
  6482. level.zombie_sidequest_coop_collectible = [];
  6483. }
  6484.  
  6485. level.zombie_sidequest_solo_stat[id] = solo_stat;
  6486. level.zombie_sidequest_solo_collectible[id] = solo_collectible;
  6487. level.zombie_sidequest_coop_stat[id] = coop_stat;
  6488. level.zombie_sidequest_coop_collectible[id] = coop_collectible;
  6489.  
  6490. flag_wait( "all_players_spawned" );
  6491.  
  6492. level.zombie_sidequest_previously_completed[id] = false;
  6493. if ( flag( "solo_game" ) )
  6494. {
  6495. if ( IsDefined( level.zombie_sidequest_solo_collectible[id] ) )
  6496. {
  6497. level.zombie_sidequest_previously_completed[id] = HasCollectible( level.zombie_sidequest_solo_collectible[id] );
  6498. }
  6499. }
  6500. else
  6501. {
  6502. // don't do stats stuff if it's not an online game
  6503. if ( level.systemLink || GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size )
  6504. {
  6505. if ( IsDefined( level.zombie_sidequest_coop_collectible[id] ) )
  6506. {
  6507. level.zombie_sidequest_previously_completed[id] = HasCollectible( level.zombie_sidequest_coop_collectible[id] );
  6508. }
  6509. return;
  6510. }
  6511.  
  6512. if ( !isdefined( level.zombie_sidequest_coop_stat[id] ) )
  6513. {
  6514. return;
  6515. }
  6516.  
  6517. players = get_players();
  6518. for ( i = 0; i < players.size; i++ )
  6519. {
  6520. if ( players[i] zombieStatGet( level.zombie_sidequest_coop_stat[id] ) )
  6521. {
  6522. level.zombie_sidequest_previously_completed[id] = true;
  6523. return;
  6524. }
  6525. }
  6526. }
  6527. }
  6528.  
  6529.  
  6530. is_sidequest_previously_completed(id)
  6531. {
  6532. return is_true( level.zombie_sidequest_previously_completed[id] );
  6533. }
  6534.  
  6535.  
  6536. set_sidequest_completed(id)
  6537. {
  6538. if ( maps\_cheat::is_cheating() || flag( "has_cheated" ) )
  6539. {
  6540. return;
  6541. }
  6542.  
  6543. if ( flag( "solo_game" ) )
  6544. {
  6545. client_notify_str = "SQS";
  6546. }
  6547. else
  6548. {
  6549. client_notify_str = "SQC";
  6550. }
  6551. clientnotify( client_notify_str ); // updates the collectibles value
  6552.  
  6553. level notify( "zombie_sidequest_completed", id );
  6554. level.zombie_sidequest_previously_completed[id] = true;
  6555.  
  6556. // don't do stats stuff if it's not an online game
  6557. if ( level.systemLink )
  6558. {
  6559. return;
  6560. }
  6561. if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size )
  6562. {
  6563. return;
  6564. }
  6565.  
  6566. players = get_players();
  6567. for ( i = 0; i < players.size; i++ )
  6568. {
  6569. if ( isdefined( level.zombie_sidequest_solo_stat[id] ) )
  6570. {
  6571. players[i] zombieStatSet( level.zombie_sidequest_solo_stat[id], (players[i] zombieStatGet( level.zombie_sidequest_solo_stat[id] ) + 1) );
  6572. }
  6573.  
  6574. if ( !flag( "solo_game" ) && isdefined( level.zombie_sidequest_coop_stat[id] ) )
  6575. {
  6576. players[i] zombieStatSet( level.zombie_sidequest_coop_stat[id], (players[i] zombieStatGet( level.zombie_sidequest_coop_stat[id] ) + 1) );
  6577. }
  6578. }
  6579. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement