Advertisement
Guest User

Untitled

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