Advertisement
Guest User

Untitled

a guest
May 6th, 2016
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 151.28 KB | None | 0 0
  1. /*#===================================================================###
  2. ### ###
  3. ### ###
  4. ### Harry Bo21s Perks v4.0.2 ###
  5. ### * Overwrites the original _zombiemode_perks.gsc ###
  6. ### ###
  7. ### ###
  8. ###===================================================================#*/
  9. /*=======================================================================
  10.  
  11. CREDITS
  12.  
  13. =========================================================================
  14. ProRevenge - Heavy testing and input
  15. StevieWonder87 - Heavy testing, input and FX - All the assets for Widows Wine
  16. BluntStuffy - Input, scripting help, Anims and FX
  17. RedSpace200 - Scripting help and Assets for Whos Who
  18. thezombieproject - Testing and locating some errors
  19. Smasher248 - Testing
  20. JiffyNoodles - Testing
  21. MZSlayer - Testing
  22. AndyWhelen - Testing
  23. HitmanVere - Testing, Vulture Aid Shaders for the fx, input and photoshop work
  24. ProGamerzFTW - Testing and script support
  25. Scobalula - Testing and script support
  26. GerardS0406 - Testing
  27. PCModder - Testing
  28. IperBreach - Testing
  29. TomBMX - Various Tools
  30. Treyarch and Activision - For the concept and assets that were used
  31. AllModz - Adivce and scripting help
  32. Lilrifa - Black Ops 3 Models and scripting help
  33. =======================================================================*/
  34. #include maps\_utility;
  35. #include common_scripts\utility;
  36. #include maps\_zombiemode_utility;
  37. #include maps\_harrybo21_utilities;
  38. #include maps\_hud_util;
  39. #include maps\_zombiemode_bo2_utility;
  40. #using_animtree( "generic_human" );
  41.  
  42. init()
  43. {
  44. level.harrys_perks = true;
  45. level thread harrybo21_perks_main();
  46. level thread harrybo21_utilities_init();
  47. }
  48.  
  49. harrybo21_perks_main()
  50. {
  51. level.DLC3.useElectricSwitch = true;
  52. // ================================= USE PERKS =================================
  53.  
  54. // ================================= WAW PERKS =================================
  55. set_zombie_var( "use_quick_revive", true ); // Use Quick Revive/Revive
  56. set_zombie_var( "use_jugg", true ); // Use Juggernog
  57. set_zombie_var( "use_double_tap_2", true ); // Use Double Tap 2.0
  58. set_zombie_var( "use_speed_cola", true ); // Use Speed Cola
  59.  
  60. // ================================= BO1 PERKS =================================
  61. set_zombie_var( "use_deadshot_daiquiri", false ); // Use Deadshot Daiquiri
  62. set_zombie_var( "use_stamin_up", false ); // Use Stamin-up
  63. set_zombie_var( "use_phd_flopper", true ); // Use P.H.D Flopper
  64. set_zombie_var( "use_mule_kick", true ); // Use Mule Kick
  65.  
  66. // ================================= BO2 PERKS =================================
  67. set_zombie_var( "use_tombstone_soda", false ); // Use Tombstone Soda
  68. set_zombie_var( "use_whos_who", false ); // Use Whos Who
  69. set_zombie_var( "use_electric_cherry", true ); // Use Electric Cherry
  70. set_zombie_var( "use_vulture_aid", false ); // Use Vulture Aid Elixir
  71. set_zombie_var( "use_wunderfizz", false ); // Use Wunderfizz
  72.  
  73. // ================================= BO3 PERKS =================================
  74. set_zombie_var( "use_widows_wine", true ); // Use Widows Wine
  75.  
  76. // ================================= USE PERKS =================================
  77.  
  78. // ================================= PRECACHE MDOELS SHADERS AND WEAPON FILES =================================
  79. PrecacheItem( "zombie_bo2_perk_bottles" );
  80. PrecacheItem( "bo2_zm_knuckle_crack" );
  81. PrecacheItem( "mustang_sally" );
  82. PrecacheItem( "zombie_downed" );
  83.  
  84. if ( isDefined( level.zombie_vars[ "use_tombstone_soda" ] ) && level.zombie_vars[ "use_tombstone_soda" ] )
  85. PrecacheModel( "bo2_ch_tombstone1" );
  86.  
  87. if ( isDefined( level.zombie_vars[ "use_vulture_aid" ] ) && level.zombie_vars[ "use_vulture_aid" ] )
  88. {
  89. PrecacheModel( "bo2_p6_zm_perk_vulture_ammo" );
  90. PrecacheModel( "bo2_p6_zm_perk_vulture_points" );
  91. PrecacheShader( "vending_vulture_glow_shader" );
  92. }
  93. if ( isDefined( level.zombie_vars[ "use_mule_kick" ] ) && level.zombie_vars[ "use_mule_kick" ] )
  94. PrecacheShader( "vending_vulture_glow_shader" );
  95.  
  96. PrecacheModel( "bo2_p6_zm_buildable_pswitch_body" );
  97. PrecacheModel( "bo2_p6_zm_buildable_pswitch_lever" );
  98. PrecacheModel( "bo2_p6_zm_buildable_pswitch_hand" );
  99. precachemodel( "projectile_usa_m9a1_riflegrenade" );
  100.  
  101. PrecacheShader( "bo2_waypoint_revive" );
  102. // ================================= PRECACHE MDOELS SHADERS AND WEAPON FILES =================================
  103.  
  104. // ================================= PRECACHE FX =================================
  105. if ( isDefined( level.zombie_vars[ "use_phd_flopper" ] ) && level.zombie_vars[ "use_phd_flopper" ] )
  106. level._effect[ "phd_nuke" ] = loadfx( "explosions/default_explosion" );
  107. if ( isDefined( level.zombie_vars[ "use_vulture_aid" ] ) && level.zombie_vars[ "use_vulture_aid" ] )
  108. {
  109. level._effect[ "vulture_glow" ] = loadfx( "harrys/fx_vulture_glow" );
  110. level._effect[ "vulture_mist" ] = loadfx( "harrys/fx_vulture_mist" );
  111. level._effect[ "vulture_cherry_shader" ] = loadfx( "harrys/fx_vulture_cherry" );
  112. level._effect[ "vulture_widow_shader" ] = loadfx( "harrys/fx_vulture_widow" );
  113. level._effect[ "vulture_deadshot_shader" ] = loadfx( "harrys/fx_vulture_deadshot" );
  114. level._effect[ "vulture_phd_shader" ] = loadfx( "harrys/fx_vulture_phd" );
  115. level._effect[ "vulture_tomb_shader" ] = loadfx( "harrys/fx_vulture_tomb" );
  116. level._effect[ "vulture_whoswho_shader" ] = loadfx( "harrys/fx_vulture_whoswho" );
  117. level._effect[ "vulture_wunderfizz_shader" ]= loadfx( "harrys/fx_vulture_wunderfizz" );
  118. level._effect[ "vulture_dt_shader" ] = loadfx( "harrys/fx_vulture_double" );
  119. level._effect[ "vulture_mule_shader" ] = loadfx( "harrys/fx_vulture_mule" );
  120. level._effect[ "vulture_box_shader" ] = loadfx( "harrys/fx_vulture_box" );
  121. level._effect[ "vulture_pap_shader" ] = loadfx( "harrys/fx_vulture_pap" );
  122. level._effect[ "vulture_revive_shader" ] = loadfx( "harrys/fx_vulture_revive" );
  123. level._effect[ "vulture_rifle_shader" ] = loadfx( "harrys/fx_vulture_rifle" );
  124. level._effect[ "vulture_skull_shader" ] = loadfx( "harrys/fx_vulture_skull" );
  125. level._effect[ "vulture_stamin_shader" ] = loadfx( "harrys/fx_vulture_stamin" );
  126. level._effect[ "vulture_vulture_shader" ] = loadfx( "harrys/fx_vulture_vulture" );
  127. level._effect[ "vulture_speed_shader" ] = loadfx( "harrys/fx_vulture_speed" );
  128. level._effect[ "vulture_jugg_shader" ] = loadfx( "harrys/fx_vulture_jugg" );
  129. }
  130. if ( isDefined( level.zombie_vars[ "use_electric_cherry" ] ) && level.zombie_vars[ "use_electric_cherry" ] )
  131. {
  132. level._effect[ "tesla_shock_eyes" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock_eyes" );
  133. level._effect[ "tesla_shock" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock" );
  134. level._effect[ "tesla_shock_secondary" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock_secondary" );
  135. level._effect[ "cherry_shock_0" ] = loadfx( "steviewonder87/cherry_1" );
  136. level._effect[ "cherry_shock_1" ] = loadfx( "steviewonder87/cherry_2" );
  137. level._effect[ "cherry_shock_2" ] = loadfx( "steviewonder87/cherry_3" );
  138. level._effect[ "cherry_shock_3" ] = loadfx( "steviewonder87/cherry_4" );
  139. }
  140. if ( isDefined( level.zombie_vars[ "use_whos_who" ] ) && level.zombie_vars[ "use_whos_who" ] )
  141. level._effect[ "whos_who_burst" ] = loadfx( "harrys/fx_whos_who" );
  142.  
  143. level._effect[ "fx_zombie_cola_blue" ] = loadfx( "misc/fx_zombie_cola_revive_on" );
  144. level._effect[ "fx_zombie_cola_red" ] = loadfx( "misc/fx_zombie_cola_jugg_on" );
  145. level._effect[ "fx_zombie_cola_green" ] = loadfx( "misc/fx_zombie_cola_on" );
  146. level._effect[ "fx_zombie_cola_yellow" ] = loadfx( "misc/fx_zombie_cola_dtap_on" );
  147. level._effect[ "pistol_flash" ] = loadfx ( "weapon/muzzleflashes/pistolflash_view" );
  148. level._effect[ "pistol_brass" ] = loadfx ( "weapon/shellejects/pistol_view" );
  149. level._effect[ "grenade_explosion" ] = loadfx ( "explosions/grenadeExp_default" );
  150. level._effect[ "mustang_trail" ] = loadfx ( "weapon/grenade/fx_trail_rifle_grenade" );
  151. level._effect[ "perk_lottery_fx" ] = loadfx ( "misc/fx_zombie_perk_lottery_4" );
  152. // ================================= PRECACHE FX =================================
  153.  
  154. // ================================= SETUP =================================
  155. level.wonderfizz_perks = []; // Array the wunderfizz perks are stored in
  156. level.zombie_perks = []; // Array the perks are stored in
  157. // ================================= SETUP =================================
  158.  
  159. // ================================= GENERAL SETTINGS ===============================
  160. set_zombie_var( "use_power_switch", true ); // Decide if you want to have a power switch
  161. set_zombie_var( "immune_to_powerdown", false ); // Decide if you want to use "depowered" perks like in tranzit
  162. set_zombie_var( "vision_file", "zombie_factory" ); // Change this to your vision file
  163. set_zombie_var( "debug", false ); // Debug on/off
  164. set_zombie_var( "start_pistol", "zombie_colt" ); // Need this to be a weapon in your mod, if you pap with just one gun, itll bug out if its not right
  165. set_zombie_var( "start_grenade", "fraggrenade" ); // Need this to correct your inventory after downs
  166. set_zombie_var( "last_stand_pistol", "zombie_colt" ); // Need this to be a weapon in your mod that you get during a solo down
  167. set_zombie_var( "max_perks", 9 ); // Set to how many perks you want to initially limit the players to
  168. set_zombie_var( "perk_jingle_wait_min", 320 ); // Minimum time to wait before trying to play a jingle again, ( checks are specfic to each machine )
  169. set_zombie_var( "perk_jingle_wait_max", 2000 ); // Maximum time to wait before trying to play a jingle again, ( checks are specfic to each machine )
  170. set_zombie_var( "use_power_off_functionality", false ); // Set this to true, if you want to be able to turn power off again. other wise, set to false
  171. set_zombie_var( "use_d2p", true ); // Set this to true, if you want to use my crappy Dive To Prone
  172. // ================================= GENERAL SETTINGS ===============================
  173.  
  174. // ================================= QUICK REVIVE =================================
  175. if ( isDefined( level.zombie_vars[ "use_quick_revive" ] ) && level.zombie_vars[ "use_quick_revive" ] )
  176. {
  177. set_zombie_var( "revive_trigger_distance", 60 ); // Size of Revive trigger with Quick Revive
  178. set_zombie_var( "solo_revive_time", 8 ); // Amount of time it takes to revive you on solo
  179. set_zombie_var( "solo_revive_uses", 3 ); // Amount of time it takes to revive you on solo
  180. }
  181. // ================================= QUICK REVIVE =================================
  182.  
  183. // ================================= JUGGERNOG =================================
  184. if ( isDefined( level.zombie_vars[ "use_jugg" ] ) && level.zombie_vars[ "use_jugg" ] )
  185. {
  186. set_zombie_var( "juggernog_health_normal", 100 ); // Max health with Juggernog
  187. set_zombie_var( "juggernog_health_max", 250 ); // Max health with Juggernog
  188. }
  189. // ================================= JUGGERNOG =================================
  190.  
  191. // ================================= SPEED COLA =================================
  192. if ( isDefined( level.zombie_vars[ "use_speed_cola" ] ) && level.zombie_vars[ "use_speed_cola" ] )
  193. {
  194. set_zombie_var( "speed_reload_rate_normal", 1 ); // Speed cola reload multiplier, 0.0 - 1.0;
  195. set_zombie_var( "speed_reload_rate", .5 ); // Speed cola reload multiplier, 0.0 - 1.0;
  196. }
  197. // ================================= SPEED COLA =================================
  198.  
  199. // ================================= DOUBLE TAP 2.0 =================================
  200. if ( isDefined( level.zombie_vars[ "use_double_tap_2" ] ) && level.zombie_vars[ "use_double_tap_2" ] )
  201. {
  202. set_zombie_var( "doubletap_fire_rate_normal", 1 ); // Double taps fire multiplier, 0.0 - 1.0;
  203. set_zombie_var( "doubletap_fire_rate", .75 ); // Double taps fire multiplier, 0.0 - 1.0;
  204. }
  205. // ================================= DOUBLE TAP 2.0 =================================
  206.  
  207. // ================================= DEADSHOT DAIQUIRI =================================
  208. if ( isDefined( level.zombie_vars[ "use_deadshot_daiquiri" ] ) && level.zombie_vars[ "use_deadshot_daiquiri" ] )
  209. {
  210. set_zombie_var( "deadshot_laser", 1 ); // use Deadshot Laser
  211. set_zombie_var( "deadshot_laser_radius", .1 ); // Deadshot laser radius
  212. set_zombie_var( "deadshot_light_radius", .4 ); // Deadshot laser light radius
  213. set_zombie_var( "deadshot_spread_multiplier", .4225 ); // Deadshot hip fire reduction
  214. set_zombie_var( "deadshot_point_reward", 40 ); // Deadshot headshot kill reward bonus amount
  215. }
  216. // ================================= DEADSHOT DAIQUIRI =================================
  217.  
  218. // ================================= STAMIN-UP =================================
  219. if ( isDefined( level.zombie_vars[ "use_stamin_up" ] ) && level.zombie_vars[ "use_stamin_up" ] )
  220. {
  221. set_zombie_var( "staminup_sprint_scale", 1.07 ); // Staminup run speed scale
  222. set_zombie_var( "staminup_sprint_max_duration", 8 ); // Staminup max sprint duration
  223. }
  224. // ================================= STAMIN-UP =================================
  225.  
  226. // ================================= PHD-FLOPPER =================================
  227. if ( isDefined( level.zombie_vars[ "use_phd_flopper" ] ) && level.zombie_vars[ "use_phd_flopper" ] )
  228. {
  229. set_zombie_var( "phd_max_damage", 1700 ); // PHD nuke effects max damage
  230. set_zombie_var( "phd_max_range", 256 ); // PHD nuke effects max range
  231. set_zombie_var( "phd_drop_requirement", 90 ); // Minimum distance you must fall for Dive to Nuke
  232. }
  233. // ================================= PHD-FLOPPER =================================
  234.  
  235. // ================================= MULE KICK =================================
  236. if ( isDefined( level.zombie_vars[ "use_mule_kick" ] ) && level.zombie_vars[ "use_mule_kick" ] )
  237. {
  238. set_zombie_var( "use_mule_kick_hud", true ); // Use custom Mule Kick hud indicator
  239. set_zombie_var( "mule_kick_max_weapons", 3 ); // Max amount of weapons with Mule Kick
  240. }
  241. // ================================= MULE KICK =================================
  242.  
  243. // ================================= ELECTRIC CHERRY =================================
  244. if ( isDefined( level.zombie_vars[ "use_electric_cherry" ] ) && level.zombie_vars[ "use_electric_cherry" ] )
  245. {
  246. set_zombie_var( "electric_cherry_max_damage", 1054 ); // Electric Cherry max damage
  247. set_zombie_var( "electric_cherry_boss_damage", 500 ); // Electric Cherry max damage
  248. set_zombie_var( "electric_cherry_max_range", 128 ); // Electric Cherry max range
  249. set_zombie_var( "electric_cherry_points", 40 ); // Electric Cherry Points given for a kill
  250. }
  251. // ================================= ELECTRIC CHERRY =================================
  252.  
  253. // ================================= VULTURE AID =================================
  254. if ( isDefined( level.zombie_vars[ "use_vulture_aid" ] ) && level.zombie_vars[ "use_vulture_aid" ] )
  255. {
  256. set_zombie_var( "vulture_drop_chance", 65 ); // Chance of a zombie dropping anything at all
  257. set_zombie_var( "vulture_ammo_chance", 33 ); // Chance of zombie being a zombie that drops ammo default = 33% ( 1 in 3 )
  258. set_zombie_var( "vulture_points_chance", 33 ); // Chance of zombie being a zombie that drops points default = 33% ( 1 in 3 )
  259. set_zombie_var( "vulture_stink_chance", 33 ); // Chance of zombie being a stink zombie default = 33% ( 1 in 3 )
  260. set_zombie_var( "vulture_drops_max", 20 ); // Max amount of vulture drops that can be around per player at once
  261. set_zombie_var( "vulture_max_stink_zombies", 4 ); // Max amount of mist zombies that can be around at once
  262. set_zombie_var( "vulture_on_dogs", true ); // Vulture Aid drops and mist work on dogs
  263. set_zombie_var( "vulture_mist_time", 20 ) ; // Length of vulture mist effect before dispersing
  264.  
  265. level.vulture_huds = [];
  266. level.vulture_huds[ "specialty_specialgrenade" ] = "vulture_widow_shader";
  267. level.vulture_huds[ "specialty_boost" ] = "vulture_cherry_shader";
  268. level.vulture_huds[ "specialty_bulletaccuracy" ] = "vulture_deadshot_shader";
  269. level.vulture_huds[ "specialty_detectexplosive" ] = "vulture_phd_shader";
  270. level.vulture_huds[ "specialty_reconnaissance" ] = "vulture_tomb_shader";
  271. level.vulture_huds[ "specialty_shades" ] = "vulture_whoswho_shader";
  272. level.vulture_huds[ "specialty_extraammo" ] = "vulture_mule_shader";
  273. level.vulture_huds[ "specialty_rof" ] = "vulture_dt_shader";
  274. level.vulture_huds[ "specialty_quickrevive" ] = "vulture_revive_shader";
  275. level.vulture_huds[ "specialty_longersprint" ] = "vulture_stamin_shader";
  276. level.vulture_huds[ "specialty_ordinance" ] = "vulture_vulture_shader";
  277. level.vulture_huds[ "specialty_fastreload" ] = "vulture_speed_shader";
  278. level.vulture_huds[ "specialty_armorvest" ] = "vulture_jugg_shader";
  279. level.vulture_huds[ "vulture_pap_shader" ] = "vulture_pap_shader";
  280. level.vulture_huds[ "vulture_skull_shader" ] = "vulture_skull_shader";
  281. level.vulture_huds[ "vulture_rifle_shader" ] = "vulture_rifle_shader";
  282. level.vulture_huds[ "vulture_wunderfizz_shader" ] = "vulture_wunderfizz_shader";
  283. level.vulture_huds[ "vulture_box_shader" ] = "vulture_box_shader";
  284. }
  285. // ================================= VULTURE AID =================================
  286.  
  287. // ================================= TOMBSTONE SODA =================================
  288. if ( isDefined( level.zombie_vars[ "use_tombstone_soda" ] ) && level.zombie_vars[ "use_tombstone_soda" ] )
  289. set_zombie_var( "tombstone_enable_solo_version", true ); // Turns on my solo version of Tombstone, as well as the co-op only version
  290.  
  291. // ================================= TOMBSTONE SODA =================================
  292.  
  293. // ================================= WHOS WHO ======================================
  294. if ( isDefined( level.zombie_vars[ "use_whos_who" ] ) && level.zombie_vars[ "use_whos_who" ] )
  295. set_zombie_var( "whos_who_bleedout_time", getDvarFloat( "player_lastStandBleedoutTime" ) ); // Bleedout time for Whos Who
  296.  
  297. // ================================= WHOS WHO ======================================
  298.  
  299. // ================================= WIDOWS WINE ======================================
  300. if ( isDefined( level.zombie_vars[ "use_widows_wine" ] ) && level.zombie_vars[ "use_widows_wine" ] )
  301. {
  302. precacheModel( "t7_ww_powerup" );
  303. precacheModel( "t7_ww_grenade_proj" );
  304. precacheShader( "vending_widows_grenade_indicator" );
  305. precacheItem( "bo3_zm_widows_grenade" );
  306.  
  307. level._effect[ "widows_wine_explode" ] = loadfx ( "harrys/fx_widows_wine_explode" );
  308. level._effect[ "widows_wine_zombie" ] = loadfx ( "harrys/fx_widows_wine_zombie" );
  309. level._effect[ "solo_powerup_on" ] = loadfx( "misc/fx_zombie_powerup_on_solo" );
  310. level._effect[ "solo_powerup_grabbed" ] = loadfx( "misc/fx_zombie_powerup_grab_solo" );
  311. level._effect[ "solo_powerup_grabbed_wave" ] = loadfx( "misc/fx_zombie_powerup_wave_solo" );
  312.  
  313. set_zombie_var( "widows_wine_drop_chance", 22 ); // Chance of a zombie dropping anything at all
  314. // set_zombie_var( "default_grenade", "fraggrenade" ); // Your maps default grenade that you start with - required
  315. set_zombie_var( "widows_wine_max_range", 128 ); // Widows wine explode max range
  316. set_zombie_var( "widows_wine_max_damage", 3 ); // Widows wine exlosion and after effect damage - percentage of total health
  317. set_zombie_var( "widows_wine_max_melee_damage", 300 ); // Widows wine melee damage addition
  318. }
  319. // ================================= WIDOWS WINE ======================================
  320.  
  321. // ================================= PACK A PUNCH ===============================
  322. level maps\_zombiemode_pack_a_punch::harrybo21_perks_upgrade_init(); // To remove this, just comment it out - or just dont place one
  323. // ================================= PACK A PUNCH ===============================
  324.  
  325. // ================================= WUNDERFIZZ ===============================
  326. if ( isDefined( level.zombie_vars[ "use_wunderfizz" ] ) && level.zombie_vars[ "use_wunderfizz" ] )
  327. level thread maps\_zombiemode_wunderfizz::harrybo21_perks_init_wonderfizz(); // To remove this, just comment it out - or just dont place one
  328. // ================================= WUNDERFIZZ ===============================
  329.  
  330. level thread harrybo21_perks_init(); // Start logic
  331.  
  332. registerClientSys( "zombiemode_perks" );
  333.  
  334. level thread harrybo21_vulture_chest_watcher();
  335. }
  336.  
  337. // DONE =============================
  338. harrybo21_weapons_inventory_reset()
  339. {
  340. self takeAllWeapons();
  341. wait 1;
  342. self.inventory = [];
  343. self.inventory[ 0 ] = level.zombie_vars[ "start_pistol" ];
  344. self.inventory[ 1 ] = "none";
  345. self.action_inventory = [];
  346. self.action_inventory[ 0 ] = "none";
  347. self setactionslot( 0, "", undefined );
  348. self.action_inventory[ 1 ] = "none";
  349. self setactionslot( 1, "", undefined );
  350. self.action_inventory[ 2 ] = "none";
  351. self setactionslot( 2, "", undefined );
  352. self.action_inventory[ 3 ] = "none";
  353. self setactionslot( 3, "", undefined );
  354. self.grenade = level.zombie_vars[ "start_grenade" ];
  355. self.alt_grenade = undefined;
  356.  
  357. self giveWeapon( level.zombie_vars[ "start_pistol" ] );
  358. self set_player_current_grenade( "fraggrenade", 0 );
  359. self switchToWeapon( level.zombie_vars[ "start_pistol" ] );
  360. }
  361.  
  362. // DONE =============================
  363. debug_weapons()
  364. {
  365. while( 1 )
  366. {
  367. if ( !isDefined( self.inventory ) || self.inventory.size < 1 )
  368. {
  369. wait .1;
  370. continue;
  371. }
  372. for ( i = 0; i < self.inventory.size; i++ )
  373. iPrintLnBold( i + " : " + self.inventory[ i ] );
  374.  
  375. for ( i = 0; i < self.action_inventory.size; i++ )
  376. iPrintLnBold( i + " : " + self.action_inventory[ i ] );
  377.  
  378. wait 1;
  379. }
  380. }
  381.  
  382. // DONE =============================
  383. harrybo21_perks_set_dvars()
  384. {
  385. self setClientDvar( "revive_trigger_radius", level.zombie_vars[ "revive_trigger_distance" ] );
  386. self setClientDvar( "perk_weapReloadMultiplier", level.zombie_vars[ "speed_reload_rate" ] );
  387. self setClientDvar( "perk_weapRateMultiplier", level.zombie_vars[ "doubletap_fire_rate" ] );
  388. self setClientDvar( "cg_laserForceOn", "0" );
  389. }
  390.  
  391. // DONE =============================
  392. harrybo21_perks_player_debug()
  393. {
  394. self.score = 500000;
  395. self.max_perks = 14;
  396. }
  397.  
  398. // DONE =============================
  399. harrybo21_perks_on_player_connect()
  400. {
  401. index = 0;
  402. for( ;; )
  403. {
  404. level waittill( "connecting", player );
  405. player thread harrybo21_perks_on_player_spawned();
  406. player thread harrybo21_perks_setup_player();
  407.  
  408. player thread wait_for_client_notify( index );
  409.  
  410. player thread pass_spawned_notify_to_csc( index );
  411. player thread pass_downed_notify_to_csc( index );
  412. player thread pass_death_notify_to_csc( index );
  413. player thread pass_revived_notify_to_csc( index );
  414.  
  415. if ( isDefined( level.zombie_vars[ "use_widows_wine" ] ) && level.zombie_vars[ "use_widows_wine" ] )
  416. player thread harrybo21_perks_widows_wine_watch_for_throw();
  417.  
  418. index++;
  419. }
  420. }
  421.  
  422. // DONE =============================
  423. harrybo21_perks_on_player_spawned()
  424. {
  425. for( ;; )
  426. {
  427. self waittill( "spawned_player" );
  428. self harrybo21_perks_reset_player();
  429. self harrybo21_weapons_inventory_reset();
  430. }
  431. }
  432.  
  433. wait_for_client_notify( index )
  434. {
  435. self endon( "disconnect" );
  436. while( 1 )
  437. {
  438. dvar = getDvar( "player_" + index + "_notify" );
  439. if( isDefined( dvar ) && dvar != "" )
  440. {
  441. self setClientDvar( "player_" + index + "_notify", "" );
  442. self notify( dvar );
  443. }
  444. wait .05;
  445. }
  446. }
  447.  
  448. pass_spawned_notify_to_csc( index )
  449. {
  450. self endon( "disconnect" );
  451. while( 1 )
  452. {
  453. self waittill( "spawned_player" );
  454. self setClientSysState( "levelNotify", "player_" + index + "_spawned" );
  455. }
  456. }
  457.  
  458. pass_downed_notify_to_csc( index )
  459. {
  460. self endon( "disconnect" );
  461. while( 1 )
  462. {
  463. self waittill( "player_downed" );
  464. self setClientSysState( "levelNotify", "player_" + index + "_downed" );
  465. }
  466. }
  467.  
  468. pass_death_notify_to_csc( index )
  469. {
  470. self endon( "disconnect" );
  471. while( 1 )
  472. {
  473. self waittill( "death" );
  474. self setClientSysState( "levelNotify", "player_" + index + "_death" );
  475. }
  476. }
  477.  
  478. pass_revived_notify_to_csc( index )
  479. {
  480. self endon( "disconnect" );
  481. while( 1 )
  482. {
  483. self waittill( "player_revived" );
  484. self setClientSysState( "levelNotify", "player_" + index + "_revived" );
  485. }
  486. }
  487.  
  488. // DONE =============================
  489. harrybo21_perks_game_type()
  490. {
  491. flag_wait( "all_players_connected" );
  492. // wait_network_frame();
  493.  
  494. players = get_players();
  495. for ( i = 0; i < players.size; i++ )
  496. players[ i ] harrybo21_perks_set_dvars();
  497.  
  498. if ( players.size < 2 )
  499. level thread harrybo21_perks_solo_game();
  500. else
  501. level thread harrybo21_perks_co_op_game();
  502.  
  503. if ( !level.zombie_vars[ "use_power_switch" ] )
  504. level thread harrybo21_perks_power_on();
  505. }
  506.  
  507. // REVIEW =============================
  508. harrybo21_perks_solo_game()
  509. {
  510. // If its a solo game, make your changes here ==============================================================================
  511. level.zombie_perks[ "specialty_quickrevive" ].perk_hint = "Press & hold ^6&&1^7 to buy Revive [Cost: 500]";
  512. level.zombie_perks[ "specialty_quickrevive" ].perk_cost = 500;
  513. level thread harrybo21_perks_limit_perk_usage( "specialty_quickrevive", level.zombie_vars[ "solo_revive_uses" ] );
  514. level thread harrybo21_perks_ignore_power( "specialty_quickrevive" );
  515. if ( !isDefined( level.zombie_vars[ "tombstone_enable_solo_version" ] ) || !level.zombie_vars[ "tombstone_enable_solo_version" ] )
  516. {
  517. level thread harrybo21_perks_remove_perk( "specialty_reconnaissance" );
  518. // if ( isDefined( level.has_wunderfizz ) && level.has_wunderfizz )
  519. // maps\_zombiemode_wunderfizz::harrybo21_perks_wonderfizz_remove( "specialty_reconnaissance" );
  520.  
  521. }
  522. }
  523.  
  524. // DONE =============================
  525. harrybo21_perks_co_op_game()
  526. {
  527. // If its a co-op game, make your changes here ==============================================================================
  528. }
  529.  
  530. // DONE =============================
  531. harrybo21_perks_mustang_trail( model1, model2 )
  532. {
  533. wait .05;
  534. PlayFXOnTag( level._effect[ "mustang_trail" ], model1, "tag_origin" );
  535. PlayFXOnTag( level._effect[ "mustang_trail" ], model2, "tag_origin" );
  536. }
  537.  
  538. // DONE =============================
  539. harrybo21_perks_mustang_fired()
  540. {
  541. self endon ( "disconnect" );
  542. while( 1 )
  543. {
  544. self waittill( "grenade_fire", grenade, weapname );
  545. if ( !issubstr( weapname, "mustang_sally" ) )
  546. continue;
  547.  
  548. self thread mustang_thread( grenade, weapname );
  549. }
  550. }
  551.  
  552. mustang_thread( grenade, weapname )
  553. {
  554. model1 = spawn( "script_model" , grenade.origin + ( anglesToRight( grenade.angles ) * -10 ) );
  555. model1 setModel( "projectile_usa_m9a1_riflegrenade" );
  556. model1.angles = grenade.angles;
  557. model1 linkTo( grenade, "tag_origin", anglesToRight( grenade.angles ) * -10 );
  558.  
  559. model2 = spawn( "script_model" , grenade.origin + ( anglesToRight( grenade.angles ) * 10 ) );
  560. model2 setModel( "projectile_usa_m9a1_riflegrenade" );
  561. model2.angles = grenade.angles;
  562. model2 linkTo( grenade, "tag_origin", anglesToRight( grenade.angles ) * 10 );
  563.  
  564. self thread harrybo21_perks_mustang_trail( model1, model2 );
  565.  
  566. self waittill( "projectile_impact", weapname, point, radius );
  567. PlayFX( level._effect[ "grenade_explosion" ], point + ( anglesToRight( grenade.angles ) * -10 ) );
  568. playsoundatposition ( "rifle_grenade_explode", point + ( anglesToRight( grenade.angles ) * -10 ) );
  569. PlayFX( level._effect[ "grenade_explosion" ], point + ( anglesToRight( grenade.angles ) * 10 ) );
  570. playsoundatposition ( "rifle_grenade_explode", point + ( anglesToRight( grenade.angles ) * 10 ) );
  571. model1 delete();
  572. model1 destroy();
  573. model1 = undefined;
  574. model2 delete();
  575. model2 destroy();
  576. model2 = undefined;
  577. }
  578.  
  579. // REVIEW ==================================
  580. harrybo21_perks_spawn_dw_world_model()
  581. {
  582. self.dual_model = false;
  583. while( 1 )
  584. {
  585. self waittill( "weapon_change_complete" );
  586. current_weapon = self getCurrentWeapon();
  587. if ( current_weapon == "mustang_sally" )
  588. {
  589. if ( self.dual_model )
  590. continue;
  591.  
  592. self.dual_model = true;
  593. self attach( GetWeaponModel( "mustang_sally" ), "tag_weapon_left" );
  594. }
  595. else
  596. {
  597. if ( !self.dual_model )
  598. continue;
  599.  
  600. self.dual_model = false;
  601. self detach( GetWeaponModel( "mustang_sally" ), "tag_weapon_left" );
  602. }
  603. wait .1;
  604. }
  605. }
  606.  
  607. // REVIEW ==================================
  608. harrybo21_perks_init() // Add / Remove perks here by commenting them out
  609. {
  610. level.primaryProgressBarWidth = level.primaryProgressBarWidth;
  611. level.primaryProgressBarHeight = level.primaryProgressBarHeight + 5;
  612.  
  613. level.power_on = false;
  614. level.is_swapping = false;
  615. harrybo21_perks_power_thread();
  616.  
  617. level thread harrybo21_perks_on_player_connect();
  618.  
  619. if ( isDefined( level.zombie_vars[ "use_quick_revive" ] ) && level.zombie_vars[ "use_quick_revive" ] )
  620. harrybo21_perks_add_perk( "specialty_quickrevive", 1500, "t7_qr_off", "t7_qr_on" , "vending_quickrevive_shader", level._effect[ "fx_zombie_cola_blue" ], "Quick Revive", ::harrybo21_perks_revive, "_perk_revive_d_", 0, "mx_revive_jingle", "mx_revive_sting" );
  621. else
  622. harrybo21_perks_remove_unused_machines( "specialty_quickrevive" );
  623.  
  624. if ( isDefined( level.zombie_vars[ "use_jugg" ] ) && level.zombie_vars[ "use_jugg" ] )
  625. harrybo21_perks_add_perk( "specialty_armorvest", 2500, "t7_jugger_off", "t7_jugger_on" , "vending_juggernaut_shader", level._effect[ "fx_zombie_cola_red" ], "Juggernog", ::harrybo21_perks_juggernog, "_perk_jugga_d_", 2, "mx_jugger_jingle", "mx_jugger_sting" );
  626. else
  627. harrybo21_perks_remove_unused_machines( "specialty_armorvest" );
  628.  
  629. if ( isDefined( level.zombie_vars[ "use_double_tap_2" ] ) && level.zombie_vars[ "use_double_tap_2" ] )
  630. harrybo21_perks_add_perk( "specialty_rof", 2000, "t7_dtap2_off", "t7_dtap2_on" , "vending_doubletap_shader", level._effect[ "fx_zombie_cola_yellow" ], "Double Tap 2.0", ::harrybo21_perks_doubletap, "_perk_doubletap_d_", 1, "mx_doubletap_jingle", "mx_doubletap_sting" );
  631. else
  632. harrybo21_perks_remove_unused_machines( "specialty_rof" );
  633.  
  634. if ( isDefined( level.zombie_vars[ "use_speed_cola" ] ) && level.zombie_vars[ "use_speed_cola" ] )
  635. harrybo21_perks_add_perk( "specialty_fastreload", 3000, "t7_sleight_off", "t7_sleight_on" , "vending_fastreload_shader", level._effect[ "fx_zombie_cola_green" ], "Speed Cola", ::harrybo21_perks_speed, "_perk_speed_d_", 3, "mx_speed_jingle", "mx_speed_sting" );
  636. else
  637. harrybo21_perks_remove_unused_machines( "specialty_fastreload" );
  638.  
  639. if ( isDefined( level.zombie_vars[ "use_deadshot_daiquiri" ] ) && level.zombie_vars[ "use_deadshot_daiquiri" ] )
  640. harrybo21_perks_add_perk( "specialty_bulletaccuracy", 1500, "bo2_zm_al_vending_ads", "bo2_zm_al_vending_ads_on" , "vending_deadshot_shader", level._effect[ "fx_zombie_cola_yellow" ], "Deadshot Daiquiri", ::harrybo21_perks_deadshot, "_perk_deadshot_d_", 4, "mx_deadshot_jingle", "mx_deadshot_sting" );
  641. else
  642. harrybo21_perks_remove_unused_machines( "specialty_bulletaccuracy" );
  643.  
  644. if ( isDefined( level.zombie_vars[ "use_stamin_up" ] ) && level.zombie_vars[ "use_stamin_up" ] )
  645. harrybo21_perks_add_perk( "specialty_longersprint", 2000, "bo2_zombie_vending_marathon", "bo2_zombie_vending_marathon_on" , "vending_staminup_shader", level._effect[ "fx_zombie_cola_yellow" ], "Stamin-Up", ::harrybo21_perks_staminup, "_perk_stamine_d_", 5, "mx_marathon_jingle", "mx_marathon_sting" );
  646. else
  647. harrybo21_perks_remove_unused_machines( "specialty_longersprint" );
  648.  
  649. if ( isDefined( level.zombie_vars[ "use_phd_flopper" ] ) && level.zombie_vars[ "use_phd_flopper" ] )
  650. harrybo21_perks_add_perk( "specialty_detectexplosive", 2000, "bo2_p6_zm_al_vending_nuke", "bo2_p6_zm_al_vending_nuke_on" , "vending_phd_shader", level._effect[ "fx_zombie_cola_yellow" ], "PHD Flopper", ::harrybo21_perks_phd, "_perk_phdflopper_d_", 6, "mx_nuke_jingle", "mx_nuke_sting" );
  651. else
  652. harrybo21_perks_remove_unused_machines( "specialty_detectexplosive" );
  653.  
  654. if ( isDefined( level.zombie_vars[ "use_mule_kick" ] ) && level.zombie_vars[ "use_mule_kick" ] )
  655. harrybo21_perks_add_perk( "specialty_extraammo", 4000, "bo2_p6_zm_tm_vending_three_gun", "bo2_p6_zm_tm_vending_three_gun_on" , "vending_mule_kick_shader", level._effect[ "fx_zombie_cola_green" ], "Mule Kick", ::harrybo21_perks_mulekick, "_perk_mule_d_", 7, "mx_mule_kick_jingle", "mx_mule_kick_sting" );
  656. else
  657. harrybo21_perks_remove_unused_machines( "specialty_extraammo" );
  658.  
  659. if ( isDefined( level.zombie_vars[ "use_electric_cherry" ] ) && level.zombie_vars[ "use_electric_cherry" ] )
  660. harrybo21_perks_add_perk( "specialty_boost", 2000, "bo2_p6_zm_vending_electric_cherry", "bo2_p6_zm_vending_electric_cherry_on" , "vending_electric_cherry_shader", level._effect[ "fx_zombie_cola_blue" ], "Electric Cherry", ::harrybo21_perks_electric_cherry, undefined, 8, "mx_electric_cherry_jingle", "mx_electric_cherry_jingle" );
  661. else
  662. harrybo21_perks_remove_unused_machines( "specialty_boost" );
  663.  
  664. if ( isDefined( level.zombie_vars[ "use_tombstone_soda" ] ) && level.zombie_vars[ "use_tombstone_soda" ] )
  665. harrybo21_perks_add_perk( "specialty_reconnaissance", 2000, "bo2_zombie_vending_tombstone", "bo2_zombie_vending_tombstone_on" , "vending_tombstone_shader", level._effect[ "fx_zombie_cola_blue" ], "Tombstone Soda", ::harrybo21_perks_tombstone, undefined, 9, "mx_tombstone_jingle", "mx_tombstone_sting" );
  666. else
  667. harrybo21_perks_remove_unused_machines( "specialty_reconnaissance" );
  668.  
  669. if ( isDefined( level.zombie_vars[ "use_whos_who" ] ) && level.zombie_vars[ "use_whos_who" ] )
  670. harrybo21_perks_add_perk( "specialty_shades", 2000, "bo2_p6_zm_vending_chugabud", "bo2_p6_zm_vending_chugabud_on" , "vending_whoswho_shader", level._effect[ "fx_zombie_cola_green" ], "Who's Who", ::harrybo21_perks_whos_who, undefined, 11, "mx_whos_who_jingle", "mx_whos_who_sting" );
  671. else
  672. harrybo21_perks_remove_unused_machines( "specialty_shades" );
  673.  
  674. if ( isDefined( level.zombie_vars[ "use_vulture_aid" ] ) && level.zombie_vars[ "use_vulture_aid" ] )
  675. harrybo21_perks_add_perk( "specialty_ordinance", 3000, "bo2_zombie_vending_vultureaid", "bo2_zombie_vending_vultureaid_on" , "vending_vulture_shader", level._effect[ "fx_zombie_cola_yellow" ], "Vulture Aid", ::harrybo21_perks_vulture, undefined, 10, "mx_vulture_jingle", "mx_vulture_sting" );
  676. else
  677. harrybo21_perks_remove_unused_machines( "specialty_ordinance" );
  678.  
  679. if ( isDefined( level.zombie_vars[ "use_widows_wine" ] ) && level.zombie_vars[ "use_widows_wine" ] )
  680. harrybo21_perks_add_perk( "specialty_specialgrenade", 3000, "t7_ww_off", "t7_ww_on" , "vending_widows_shader", level._effect[ "fx_zombie_cola_red" ], "Widows Wine", ::harrybo21_perks_widows_wine, undefined, 12, "mx_widows_jingle", "mx_widows_sting" );
  681. else
  682. harrybo21_perks_remove_unused_machines( "specialty_specialgrenade" );
  683.  
  684. harrybo21_perks_machines_init();
  685. level thread harrybo21_perks_game_type();
  686. level thread harrybo21_perks_zombie_watch_for_spawn();
  687. level thread harrybo21_perks_swapping_perk_watch_for_reset();
  688. wait 1;
  689. level.overridePlayerDamage = ::harrybo21_perks_player_damage_override;
  690. }
  691.  
  692. // DONE =============================
  693. harrybo21_perks_remove_unused_machines( perk )
  694. {
  695. machines = harrybo21_perks_get_machines_for_perk( perk );
  696. if ( !isDefined( machines ) || machines.size < 1 )
  697. return;
  698.  
  699. for ( i = 0; i < machines.size; i++ )
  700. machines[ i ] thread harrybo21_perks_remove_perk_machine();
  701.  
  702. }
  703.  
  704. // REVIEW BOSSES =============================
  705. harrybo21_perks_zombie_watch_for_spawn()
  706. {
  707. while( 1 )
  708. {
  709. zombies = getAiSpeciesArray( "axis", "all" );
  710. if ( isDefined( zombies ) && zombies.size > 0 )
  711. {
  712. for( i = 0; i < zombies.size; i++ )
  713. {
  714. if( !isDefined( zombies[ i ].spawn_functions_ran ) || !zombies[ i ].spawn_functions_ran )
  715. {
  716. zombies[ i ].spawn_functions_ran = 1;
  717. zombies[ i ] thread harrybo21_perks_vulture_zombie_function();
  718. zombies[ i ] thread harrybo21_perks_doubletap_watcher();
  719. zombies[ i ] thread harrybo21_perks_widows_watcher();
  720. }
  721. }
  722. }
  723. zombies = undefined;
  724. wait .1;
  725. }
  726. }
  727.  
  728. // DONE =============================
  729. harrybo21_perks_reset_player()
  730. {
  731. self harrybo21_perks_remove_all();
  732. self.perk_inventory = [];
  733. self.perk_hud = [];
  734. self.muleAmmo = undefined;
  735. self.lost_mule_guns = undefined;
  736. self.mule_kick_switch_back = undefined;
  737. self.immune_to_powerdown = level.zombie_vars[ "immune_to_powerdown" ];
  738. setClientSysState( "lsm", "0", self );
  739. self stopLoopSound();
  740. self VisionSetNaked( level.zombie_vars[ "vision_file" ] );
  741. }
  742.  
  743. // DONE =============================
  744. harrybo21_perks_setup_player()
  745. {
  746. self harrybo21_perks_remove_all();
  747. self harrybo21_perks_reset_player();
  748.  
  749. self.max_perks = level.zombie_vars[ "max_perks" ];
  750. // self thread harrybo21_perks_down_watcher();
  751. self thread harrybo21_perks_mule_kick_weapon_change_watcher();
  752. self thread harrybo21_perks_mustang_fired();
  753. if ( isDefined( level.zombie_vars[ "debug" ] ) && level.zombie_vars[ "debug" ] )
  754. self harrybo21_perks_player_debug();
  755.  
  756. }
  757.  
  758. // REVIEW =============================
  759. harrybo21_perks_turn_power_on_stock()
  760. {
  761. flag_wait( "electricity_on" );
  762. wait 2;
  763. if ( isDefined( level.power_on ) && level.power_on )
  764. return;
  765.  
  766. harrybo21_perks_power_on();
  767. if ( level.zombie_vars[ "use_power_off_functionality" ] )
  768. level thread harrybo21_perks_enable_switch_to_turn_off_power();
  769.  
  770. }
  771.  
  772. // DONE =============================
  773. harrybo21_perks_power_thread()
  774. {
  775. panels = getEntArray( "harrybo21_power_panels", "script_noteworthy" );
  776. if ( !isDefined( panels ) || panels.size < 1 )
  777. return;
  778. for ( i = 0; i < panels.size; i++ )
  779. {
  780. panels[ i ] setModel( "bo2_p6_zm_buildable_pswitch_body" );
  781. }
  782.  
  783. trigs = getEntArray( "harrybo21_power_trigger", "script_noteworthy" );
  784. if ( !isDefined( trigs ) || trigs.size < 1 || !isDefined( level.power_on ) )
  785. {
  786. level.zombie_vars[ "use_power_switch" ] = false;
  787. return;
  788. }
  789. for ( i = 0; i < trigs.size; i++ )
  790. {
  791. trigs[ i ].handle = getEnt( trigs[ i ].targetname, "target" );
  792. trigs[ i ].handle setModel( "bo2_p6_zm_buildable_pswitch_lever" );
  793. trigs[ i ].handle notsolid();
  794. trigs[ i ].hand = getEnt( trigs[ i ].handle.targetname, "target" );
  795. trigs[ i ].hand setModel( "bo2_p6_zm_buildable_pswitch_hand" );
  796. trigs[ i ].hand notsolid();
  797. trigs[ i ].hand LinkTo( trigs[ i ].handle );
  798. trigs[ i ] SetCursorHint( "HINT_NOICON" );
  799. if ( !level.power_on )
  800. trigs[ i ] thread harrybo21_perks_enable_switch_to_turn_on_power();
  801. else if ( level.zombie_vars[ "use_power_off_functionality" ] )
  802. trigs[ i ] thread harrybo21_perks_enable_switch_to_turn_off_power();
  803.  
  804. }
  805. }
  806.  
  807. // DONE =============================
  808. harrybo21_perks_enable_switch_to_turn_off_power()
  809. {
  810. self.active = true;
  811. self sethintstring( "Press & hold ^6&&1^7 to deactivate power" );
  812. self waittill( "trigger" );
  813. self playsound( "switch_flip" );
  814. self.active = false;
  815. self sethintstring( "" );
  816. self.handle rotateroll( 90, .3 );
  817. trigs = getEntArray( "harrybo21_power_trigger", "script_noteworthy" );
  818.  
  819. if ( level.power_on )
  820. level thread harrybo21_perks_power_off();
  821.  
  822. wait 5;
  823. self thread harrybo21_perks_enable_switch_to_turn_on_power();
  824. }
  825.  
  826. // DONE =============================
  827. harrybo21_perks_enable_switch_to_turn_on_power()
  828. {
  829. self.active = false;
  830. self sethintstring( "Press & hold ^6&&1^7 to activate power" );
  831. self waittill( "trigger" );
  832. self playsound( "switch_flip" );
  833. self.active = true;
  834. self sethintstring( "" );
  835. self.handle rotateroll( -90, .3 );
  836. trigs = getEntArray( "harrybo21_power_trigger", "script_noteworthy" );
  837. count = undefined;
  838. if ( isDefined( trigs ) && trigs.size > 0 )
  839. {
  840. count = 0;
  841. for ( i = 0; i < trigs.size; i++ )
  842. {
  843. if ( trigs[ i ].active )
  844. count++;
  845.  
  846. }
  847. }
  848. if ( !isDefined( count ) || count == trigs.size )
  849. level thread harrybo21_perks_power_on();
  850.  
  851. wait 5;
  852. if ( level.zombie_vars[ "use_power_off_functionality" ] )
  853. self thread harrybo21_perks_enable_switch_to_turn_off_power();
  854. }
  855.  
  856. // DONE =============================
  857. harrybo21_perks_power_on()
  858. {
  859. level.power_on = true;
  860. flag_set( "electricity_on" );
  861. vending_machines = harrybo21_perks_get_machines();
  862. for ( i = 0; i < vending_machines.size; i++ )
  863. {
  864. if ( !isDefined( vending_machines[ i ].ignore_power ) || !vending_machines[ i ].ignore_power )
  865. vending_machines[ i ] notify( "activate_machine" );
  866.  
  867. }
  868. vending_machines = GetEntArray( "harrybo21_upgrade", "script_noteworthy" );
  869. for ( i = 0; i < vending_machines.size; i++ )
  870. {
  871. if ( !isDefined( vending_machines[ i ].ignore_power ) || !vending_machines[ i ].ignore_power )
  872. vending_machines[ i ] notify( "activate_machine" );
  873.  
  874. }
  875. vending_machines = maps\_zombiemode_wunderfizz::harrybo21_perks_wonderfizz_get_machines();
  876. for ( i = 0; i < vending_machines.size; i++ )
  877. {
  878. if ( !isDefined( vending_machines[ i ].ignore_power ) || !vending_machines[ i ].ignore_power )
  879. vending_machines[ i ] notify( "activate_machine" );
  880.  
  881. }
  882. wait .1;
  883. players = get_players();
  884. for ( i = 0; i < players.size; i++ )
  885. {
  886. if ( players[ i ].immune_to_powerdown )
  887. continue;
  888.  
  889. players[ i ] harrybo21_perks_power_on_owned_perks();
  890. }
  891. }
  892.  
  893. // DONE =============================
  894. harrybo21_perks_power_off()
  895. {
  896. level.power_on = false;
  897. vending_machines = harrybo21_perks_get_machines();
  898. for ( i = 0; i < vending_machines.size; i++ )
  899. {
  900. if ( !isDefined( vending_machines[ i ].ignore_power ) || !vending_machines[ i ].ignore_power )
  901. vending_machines[ i ] notify( "deactivate_machine" );
  902.  
  903. }
  904. vending_machines = GetEntArray( "harrybo21_upgrade", "script_noteworthy" );
  905. for ( i = 0; i < vending_machines.size; i++ )
  906. {
  907. if ( !isDefined( vending_machines[ i ].ignore_power ) || !vending_machines[ i ].ignore_power )
  908. vending_machines[ i ] notify( "deactivate_machine" );
  909. }
  910. /*
  911. vending_machines = maps\_zombiemode_wunderfizz::harrybo21_perks_wonderfizz_get_machines();
  912. for ( i = 0; i < vending_machines.size; i++ )
  913. {
  914. if ( !isDefined( vending_machines[ i ].ignore_power ) || !vending_machines[ i ].ignore_power )
  915. vending_machines[ i ] notify( "deactivate_machine" );
  916. }
  917. */
  918. wait .1;
  919. players = get_players();
  920. for ( i = 0; i < players.size; i++ )
  921. {
  922. if ( players[ i ].immune_to_powerdown )
  923. continue;
  924.  
  925. players[ i ] harrybo21_perks_power_off_owned_perks();
  926. }
  927. }
  928.  
  929. // DONE =============================
  930. harrybo21_perks_power_off_owned_perks()
  931. {
  932. if ( self.immune_to_powerdown || !isDefined( self.perk_inventory ) || self.perk_inventory.size < 1 )
  933. return;
  934.  
  935. for ( i = 0; i < self.perk_inventory.size; i++ )
  936. {
  937. if ( harrybo21_perks_is_machine_for_perk_active( self.perk_inventory[ i ] ) )
  938. continue;
  939.  
  940. self harrybo21_perks_hud_fade_power_off( self.perk_inventory[ i ] );
  941. self unSetPerk( self.perk_inventory[ i ] );
  942. if ( isDefined( level.zombie_perks[ self.perk_inventory[ i ] ].perk_function ) )
  943. self thread [[ level.zombie_perks[ self.perk_inventory[ i ] ].perk_function ]]( false );
  944.  
  945. if ( self.perk_inventory[ i ] == "specialty_extraammo" )
  946. self harrybo21_perks_mule_kick_take_extras();
  947. }
  948. }
  949.  
  950. // DONE =============================
  951. harrybo21_perks_power_on_owned_perks()
  952. {
  953. if ( !isDefined( self.perk_inventory ) || self.perk_inventory.size < 1 )
  954. return;
  955.  
  956. for ( i = 0; i < self.perk_inventory.size; i++ )
  957. {
  958. self harrybo21_perks_hud_fade_power_on( self.perk_inventory[ i ] );
  959. self setPerk( self.perk_inventory[ i ] );
  960. if ( isDefined( level.zombie_perks[ self.perk_inventory[ i ] ].perk_function ) )
  961. self [[ level.zombie_perks[ self.perk_inventory[ i ] ].perk_function ]]( true );
  962.  
  963. if ( self.perk_inventory[ i ] == "specialty_extraammo" )
  964. self harrybo21_perks_mule_kick_return_extras();
  965. }
  966. }
  967.  
  968. // DONE =============================
  969. harrybo21_perks_get_machines_for_perk( perk )
  970. {
  971. new_array = [];
  972. machines = harrybo21_perks_get_machines();
  973. if ( !isDefined( machines ) || machines.size < 1 )
  974. return undefined;
  975.  
  976. for ( i = 0; i < machines.size; i++ )
  977. {
  978. if ( isDefined( machines[ i ].script_string ) && machines[ i ].script_string == perk )
  979. new_array[ new_array.size ] = machines[ i ];
  980.  
  981. }
  982. if ( new_array.size > 0 )
  983. return new_array;
  984.  
  985. return undefined;
  986. }
  987.  
  988. // DONE =============================
  989. harrybo21_perks_is_machine_for_perk_active( perk )
  990. {
  991. if ( isDefined( level.zombie_perks[ perk ].ignore_power ) && level.zombie_perks[ perk ].ignore_power )
  992. return true;
  993.  
  994. perk_machines = harrybo21_perks_get_machines_for_perk( perk );
  995. if ( !isDefined( perk_machines ) || perk_machines.size < 1 )
  996. return false;
  997.  
  998. for ( i = 0; i < perk_machines.size; i++ )
  999. {
  1000. if ( isDefined( perk_machines[ i ].active ) && perk_machines[ i ].active )
  1001. return true;
  1002.  
  1003. }
  1004. return false;
  1005. }
  1006.  
  1007. // DONE =============================
  1008. harrybo21_perks_get_machine_trigger( machine )
  1009. {
  1010. trig = getEntArray( "harrybo21_perk_trigger", "targetname" );
  1011. for ( t = 0; t < trig.size; t++ )
  1012. {
  1013. if ( machine.targetname == trig[ t ].target )
  1014. return trig[ t ];
  1015.  
  1016. }
  1017. return undefined;
  1018. }
  1019.  
  1020. // DONE =============================
  1021. harrybo21_perks_get_machine_clip( machine )
  1022. {
  1023. clips = getEntArray( "harrybo21_perk_clip", "script_noteworthy" );
  1024. for ( t = 0; t < clips.size; t++ )
  1025. {
  1026. if ( machine.targetname == clips[ t ].target )
  1027. return clips[ t ];
  1028.  
  1029. }
  1030. return undefined;
  1031. }
  1032.  
  1033. // DONE =============================
  1034. harrybo21_perks_get_machines()
  1035. {
  1036. return GetEntArray( "harrybo21_vending", "script_noteworthy" );
  1037. }
  1038.  
  1039. // DONE =============================
  1040. harrybo21_perks_machines_init()
  1041. {
  1042. vending_machines = harrybo21_perks_get_machines();
  1043. for ( i = 0; i < vending_machines.size; i++ )
  1044. {
  1045. if ( isDefined( vending_machines[ i ].script_string ) )
  1046. vending_machines[ i ] harrybo21_perks_machine_initialize();
  1047. else
  1048. vending_machines[ i ] thread harrybo21_perks_machine_random_spawn();
  1049. }
  1050. }
  1051.  
  1052. // DONE =============================
  1053. harrybo21_perks_machine_random_spawn()
  1054. {
  1055. self setModel( "tag_origin" );
  1056. trig = harrybo21_perks_get_machine_trigger( self );
  1057. trig setHintString( "" );
  1058. trig SetCursorHint( "HINT_NOICON" );
  1059. triggers = getEntArray( "harrybo21_random_vending", "script_noteworthy" );
  1060. if ( !isDefined( triggers ) || triggers.size < 1 )
  1061. return;
  1062.  
  1063. trigger = undefined;
  1064. for ( i = 0; i < triggers.size; i++ )
  1065. {
  1066. if ( triggers[ i ].target == self.targetname )
  1067. {
  1068. trigger = triggers[ i ];
  1069. break;
  1070. }
  1071. }
  1072. if ( !isDefined( trigger ) )
  1073. return;
  1074.  
  1075. while( isDefined( trigger ) )
  1076. {
  1077. trigger waittill( "trigger", user );
  1078. if ( !isPlayer( user ) || !level.power_on )
  1079. {
  1080. wait .1;
  1081. continue;
  1082. }
  1083. playsoundatposition( "rando_start", self.origin );
  1084. playsoundatposition( "rando_perk", self.origin );
  1085. level thread play_sound_2D( "perk_lottery" );
  1086. playfxontag( level._effect[ "perk_lottery_fx" ], self, "tag_origin" );
  1087. self thread harrybo21_perks_randomize_machine();
  1088. self moveZ( 30, 4, 3 );
  1089. self vibrate( ( 0, -100, 0 ) , 0.3, 0.4, 5 );
  1090. wait 4;
  1091.  
  1092. self.script_string = harrybo21_perks_randomize_decide_final(); // keys[ 0 ];
  1093.  
  1094. structs = getStructArray( self.targetname, "target" );
  1095. if ( isDefined( structs ) && structs.size > 0 )
  1096. {
  1097. for ( s = 0; s < structs.size; s++ )
  1098. {
  1099. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" )
  1100. structs[ s ] harrybo21_vulture_change_hud_fx( level.vulture_huds[ self.script_string ] );
  1101.  
  1102. }
  1103. }
  1104. wait .1;
  1105. self harrybo21_vulture_hud_manage_fx( true );
  1106. wait 1;
  1107. self harrybo21_perks_machine_initialize();
  1108.  
  1109. self notify( "stop_randomize" );
  1110. self moveZ( -30, 1, 1 );
  1111. wait 1;
  1112.  
  1113. if ( isDefined( level.zombie_perks[ self.script_string ].ignore_power ) && level.zombie_perks[ self.script_string ].ignore_power )
  1114. {
  1115. self.ignore_power = true;
  1116. self notify( "activate_machine" );
  1117. }
  1118. else if ( isDefined( level.power_on ) && level.power_on )
  1119. self notify( "activate_machine" );
  1120. break;
  1121. }
  1122. trigger delete();
  1123. trigger = undefined;
  1124. }
  1125.  
  1126. // DONE =============================
  1127. harrybo21_perks_randomize_decide_final()
  1128. {
  1129. perks = harrybo21_perks_get_unplaced();
  1130.  
  1131. if ( !isDefined( perks ) )
  1132. perks = level.zombie_perks;
  1133.  
  1134. keys = getArrayKeys( perks );
  1135. keys = array_randomize( keys );
  1136.  
  1137. return keys[ 0 ];
  1138. }
  1139.  
  1140. // DONE =============================
  1141. harrybo21_perks_get_unplaced()
  1142. {
  1143. array = [];
  1144. keys = getArrayKeys( level.zombie_perks );
  1145. for ( i = 0; i < keys.size; i++ )
  1146. {
  1147. if ( isDefined( level.zombie_perks[ keys[ i ] ].removed ) && level.zombie_perks[ keys[ i ] ].removed )
  1148. continue;
  1149.  
  1150. machines = harrybo21_perks_get_machines_for_perk( keys[ i ] );
  1151. if ( !isDefined( machines ) || machines.size < 1 )
  1152. {
  1153. array[ keys[ i ] ] = keys[ i ];
  1154. continue;
  1155. }
  1156. }
  1157. if ( array.size > 0 )
  1158. return array;
  1159. else
  1160. return undefined;
  1161. }
  1162.  
  1163. // DONE =============================
  1164. harrybo21_perks_randomize_machine()
  1165. {
  1166. self endon( "stop_randomize" );
  1167. wait_time = .01;
  1168. last_key = undefined;
  1169. while( 1 )
  1170. {
  1171. perks = harrybo21_perks_get_unplaced();
  1172. if ( !isDefined( perks ) )
  1173. perks = level.zombie_perks;
  1174.  
  1175. keys = getArrayKeys( perks );
  1176. keys = array_randomize( keys );
  1177.  
  1178. key_use = 0;
  1179. if ( isDefined( last_key ) && last_key == keys[ key_use ] && keys.size > 1 )
  1180. key_use = 1;
  1181.  
  1182. self setModel( level.zombie_perks[ keys[ key_use ] ].perk_model );
  1183. last_key = keys[ key_use ];
  1184. wait wait_time;
  1185. wait_time += .01;
  1186. }
  1187. }
  1188.  
  1189. // DONE =============================
  1190. harrybo21_perks_machine_initialize()
  1191. {
  1192. self.active = false;
  1193. self setModel( level.zombie_perks[ self.script_string ].perk_model );
  1194. self.clip = harrybo21_perks_get_machine_clip( self );
  1195. self.trig = harrybo21_perks_get_machine_trigger( self );
  1196. self.trig SetHintString( &"ZOMBIE_FLAMES_UNAVAILABLE" );
  1197. self.trig SetCursorHint( "HINT_NOICON" );
  1198. self.trig thread harrybo21_perks_trigger_watcher( self );
  1199. self thread harryb21_perks_trigger_visible_watcher( self );
  1200. self thread harrybo21_perks_play_jingle();
  1201. self thread harrybo21_perks_machines_power_watcher();
  1202. self thread harrybo21_perks_check_for_change();
  1203.  
  1204. secondary_power = getEntArray( "harrybo21_secondary_power_trigger", "script_noteworthy" );
  1205. for ( i = 0; i < secondary_power.size; i++ )
  1206. {
  1207. if ( isDefined( secondary_power[ i ].target ) && secondary_power[ i ].target == self.targetname )
  1208. {
  1209. secondary_power[ i ].handle = getEnt( secondary_power[ i ].targetname, "target" );
  1210. secondary_power[ i ].handle setModel( "bo2_p6_zm_buildable_pswitch_lever" );
  1211. secondary_power[ i ].handle notsolid();
  1212. secondary_power[ i ].hand = getEnt( secondary_power[ i ].handle.targetname, "target" );
  1213. secondary_power[ i ].hand setModel( "bo2_p6_zm_buildable_pswitch_hand" );
  1214. secondary_power[ i ].hand notsolid();
  1215. secondary_power[ i ].hand LinkTo( secondary_power[ i ].handle );
  1216. secondary_power[ i ] SetCursorHint( "HINT_NOICON" );
  1217. if ( isDefined( level.power_on ) && level.power_on )
  1218. {
  1219. secondary_power[ i ] sethintstring( "Press & hold ^6&&1^7 to deactivate switch" );
  1220. secondary_power[ i ].active = true;
  1221. }
  1222. else
  1223. {
  1224. secondary_power[ i ] sethintstring( "Press & hold ^6&&1^7 to activate switch" );
  1225. secondary_power[ i ].active = false;
  1226. }
  1227. self.secondary_power = secondary_power[ i ];
  1228. self.secondary_power thread harrybo21_perks_secondary_power( self );
  1229.  
  1230. break;
  1231. }
  1232. }
  1233.  
  1234. target_by = getEntArray( "harrybo21_swapping_vending", "script_noteworthy" );
  1235. for ( i = 0; i < target_by.size; i++ )
  1236. {
  1237. if ( isDefined( target_by[ i ].target ) && target_by[ i ].target == self.targetname )
  1238. {
  1239. if ( !isDefined( level.swap_machines ) )
  1240. level.swap_machines = [];
  1241.  
  1242. level.swap_machines[ level.swap_machines.size ] = self;
  1243. self.swapping_machine = true;
  1244. self thread harrybo21_perks_spawn_swapping_perk_machine();
  1245. break;
  1246. }
  1247. }
  1248. }
  1249.  
  1250. // DONE =============================
  1251. harrybo21_perks_secondary_power( machine )
  1252. {
  1253. while( 1 )
  1254. {
  1255. hint = undefined;
  1256. self waittill( "trigger" );
  1257. self playsound( "switch_flip" );
  1258. self sethintstring( "" );
  1259. self.handle rotateroll( -90, .3 );
  1260. if ( isDefined( self.active ) && self.active )
  1261. {
  1262. hint = "Press & hold ^6&&1^7 to activate switch";
  1263. self.active = false;
  1264. if ( machine.active )
  1265. machine notify( "deactivate_machine" );
  1266. }
  1267. else
  1268. {
  1269. hint = "Press & hold ^6&&1^7 to deactivate switch";
  1270. self.active = true;
  1271. if ( isDefined( level.power_on ) && level.power_on )
  1272. {
  1273. if ( !machine.active )
  1274. machine notify( "activate_machine" );
  1275.  
  1276. }
  1277. }
  1278. wait 5;
  1279. self sethintstring( hint );
  1280. hint = undefined;
  1281. self waittill( "trigger" );
  1282. self playsound( "switch_flip" );
  1283. self sethintstring( "" );
  1284. self.handle rotateroll( 90, .3 );
  1285. if ( isDefined( self.active ) && self.active )
  1286. {
  1287. hint = "Press & hold ^6&&1^7 to activate switch";
  1288. self.active = false;
  1289. if ( machine.active )
  1290. machine notify( "deactivate_machine" );
  1291.  
  1292. }
  1293. else
  1294. {
  1295. hint = "Press & hold ^6&&1^7 to deactivate switch";
  1296. self.active = true;
  1297. if ( isDefined( level.power_on ) && level.power_on )
  1298. {
  1299. if ( !machine.active )
  1300. machine notify( "activate_machine" );
  1301. }
  1302. }
  1303. wait 5;
  1304. self sethintstring( hint );
  1305. }
  1306. }
  1307.  
  1308. // DONE =============================
  1309. harrybo21_perks_spawn_swapping_perk_machine()
  1310. {
  1311. wait .5;
  1312. triggers = getEntArray( "harrybo21_swapping_vending", "script_noteworthy" );
  1313. for ( i = 0; i < triggers.size; i++ )
  1314. {
  1315. if ( triggers[ i ].target == self.targetname )
  1316. {
  1317. self harrybo21_vulture_hud_manage_fx( false );
  1318.  
  1319.  
  1320. ent = getEnt( triggers[ i ].target, "targetname" );
  1321. ent.vulture_point delete();
  1322. triggers[ i ].is_swapping = true;
  1323. self thread harrybo21_perks_swapping_perk_randomize();
  1324. playsoundatposition( "rando_start", self.origin );
  1325. playsoundatposition( "rando_perk", self.origin );
  1326. level thread play_sound_2D( "perk_lottery" );
  1327. wait 3;
  1328.  
  1329.  
  1330.  
  1331. // wait 1;
  1332. structs = getStructArray( self.targetname, "target" );
  1333. if ( isDefined( structs ) && structs.size > 0 )
  1334. {
  1335. for ( s = 0; s < structs.size; s++ )
  1336. {
  1337. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" )
  1338. structs[ s ] harrybo21_vulture_change_hud_fx( level.vulture_huds[ self.script_string ] );
  1339.  
  1340. }
  1341. }
  1342. wait .1;
  1343. self harrybo21_vulture_hud_manage_fx( true );
  1344.  
  1345. self notify( "perk_swap_done" );
  1346. self setModel( level.zombie_perks[ self.script_string ].perk_model );
  1347. if ( isDefined( self.active ) && self.active )
  1348. self setModel( level.zombie_perks[ self.script_string ].perk_model_on );
  1349.  
  1350. wait 1;
  1351. triggers[ i ] thread harrybo21_perks_swapping_perk_machine_thread( self );
  1352. break;
  1353. }
  1354. }
  1355. for ( i = 0; i < triggers.size; i++ )
  1356. {
  1357. triggers[ i ].is_swapping = undefined;
  1358. }
  1359. // harrybo21_manage_client_fx();
  1360. }
  1361.  
  1362. // DONE =============================
  1363. harrybo21_perks_swapping_perk_watch_for_reset()
  1364. {
  1365. while( 1 )
  1366. {
  1367. level waittill( "between_round_over" );
  1368. triggers = getEntArray( "harrybo21_swapping_vending", "script_noteworthy" );
  1369. if ( !isDefined( triggers ) || triggers.size < 1 )
  1370. continue;
  1371.  
  1372. level.round_swapped = false;
  1373. }
  1374. }
  1375.  
  1376. // DONE =============================
  1377. harrybo21_perks_swapping_perk_machine_thread( machine )
  1378. {
  1379. while( 1 )
  1380. {
  1381. array = undefined;
  1382. self waittill( "trigger", user );
  1383. if ( ( isDefined( self.is_swapping ) && self.is_swapping ) || !isPlayer( user ) || !level.power_on || level.round_swapped )
  1384. {
  1385. wait .1;
  1386. continue;
  1387. }
  1388. triggers = getEntArray( "harrybo21_swapping_vending", "script_noteworthy" );
  1389. for ( i = 0; i < triggers.size; i++ )
  1390. {
  1391. triggers[ i ].is_swapping = true;
  1392. ent = getEnt( triggers[ i ].target, "targetname" );
  1393. ent harrybo21_vulture_hud_manage_fx( false );
  1394. ent.vulture_point delete();
  1395. if ( !isDefined( array ) )
  1396. array = [];
  1397.  
  1398. ent.light_location delete();
  1399. array[ array.size ] = ent.script_string;
  1400. ent thread harrybo21_perks_swapping_perk_randomize();
  1401. }
  1402. level.round_swapped = true;
  1403. level.is_swapping = true;
  1404. wait 4;
  1405. level.is_swapping = false;
  1406. for ( i = 0; i < triggers.size; i++ )
  1407. {
  1408. ent = getEnt( triggers[ i ].target, "targetname" );
  1409. ent notify( "perk_swap_done" );
  1410. }
  1411. if ( array.size > 1 )
  1412. {
  1413. new_array = [];
  1414. for ( i = 1; i < array.size; i++ )
  1415. new_array[ new_array.size ] = array[ i ];
  1416.  
  1417. new_array[ new_array.size ] = array[ 0 ];
  1418. }
  1419. else
  1420. new_array = array;
  1421.  
  1422. for ( i = 0; i < triggers.size; i++ )
  1423. {
  1424. ent = getEnt( triggers[ i ].target, "targetname" );
  1425. ent.script_string = new_array[ i ];
  1426. ent setModel( level.zombie_perks[ ent.script_string ].perk_model );
  1427.  
  1428. structs = getStructArray( ent.targetname, "target" );
  1429. if ( isDefined( structs ) && structs.size > 0 )
  1430. {
  1431. for ( s = 0; s < structs.size; s++ )
  1432. {
  1433. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" )
  1434. structs[ s ] harrybo21_vulture_change_hud_fx( level.vulture_huds[ ent.script_string ] );
  1435.  
  1436. }
  1437. }
  1438. if ( isDefined( ent.active ) && ent.active )
  1439. {
  1440. ent.light_location = spawn( "script_model", ent.origin + ( anglesToForward( ent.angles + ( 0, 90, 0 ) ) * -0 ) );
  1441. ent.light_location.angles = ( ent.angles + ( 0, 0, 0 ) );
  1442. ent.light_location setModel( "tag_origin" );
  1443. ent.trig SetHintString( level.zombie_perks[ ent.script_string ].perk_hint );
  1444. PlayFxOnTag( level.zombie_perks[ ent.script_string ].perk_light, ent.light_location, "tag_origin" );
  1445. ent setModel( level.zombie_perks[ ent.script_string ].perk_model_on );
  1446. }
  1447. }
  1448. for ( i = 0; i < triggers.size; i++ )
  1449. triggers[ i ].is_swapping = undefined;
  1450.  
  1451. }
  1452. }
  1453.  
  1454. // DONE =============================
  1455. harrybo21_perks_swapping_perk_randomize()
  1456. {
  1457. self endon( "perk_swap_done" );
  1458. self.is_swapping = true;
  1459. self hide();
  1460. self.origin = self.origin + ( 0, 0, 200 );
  1461. wait .1;
  1462. self show();
  1463. self moveZ( -200, 4, 3, 1 );
  1464. self playSound( "perk_lottery" );
  1465. playfxontag( level._effect[ "perk_lottery_fx" ], self, "tag_origin" );
  1466.  
  1467. wait_time = .01;
  1468. last_key = undefined;
  1469. while( 1 )
  1470. {
  1471. array = [];
  1472. triggers = getEntArray( "harrybo21_swapping_vending", "script_noteworthy" );
  1473. for ( i = 0; i < triggers.size; i++ )
  1474. {
  1475. ent = getEnt( triggers[ i ].target, "targetname" );
  1476. array[ array.size ] = ent.script_string;
  1477. }
  1478. array = array_randomize( array );
  1479.  
  1480. key_use = 0;
  1481. if ( isDefined( last_key ) && last_key == array[ key_use ] && array.size > 1 )
  1482. key_use = 1;
  1483.  
  1484. self setModel( level.zombie_perks[ array[ key_use ] ].perk_model );
  1485. last_key = array[ key_use ];
  1486. wait wait_time;
  1487. wait_time += .01;
  1488. }
  1489. }
  1490.  
  1491. // DONE =============================
  1492. harrybo21_perks_machines_power_watcher()
  1493. {
  1494. while( 1 )
  1495. {
  1496. while( 1 )
  1497. {
  1498. self waittill( "activate_machine" );
  1499. if ( isDefined( self.active ) && self.active )
  1500. continue;
  1501.  
  1502. if ( isDefined( self.secondary_power ) && !self.secondary_power.active )
  1503. continue;
  1504.  
  1505. break;
  1506. }
  1507. self thread harrybo21_perks_activate_machine();
  1508. while( 1 )
  1509. {
  1510. self waittill( "deactivate_machine" );
  1511. if ( isDefined( self.active ) && !self.active )
  1512. continue;
  1513.  
  1514. break;
  1515. }
  1516. self thread harrybo21_perks_deactivate_machine();
  1517. }
  1518. }
  1519.  
  1520. // REVIEW =============================
  1521. harrybo21_perks_check_for_change()
  1522. {
  1523. self endon( "machine_removed" );
  1524. change_collected = false;
  1525. while( 1 )
  1526. {
  1527. players = get_players();
  1528. for ( i = 0; i < players.size; i++ )
  1529. {
  1530. if ( distance( players[ i ].origin, self.origin ) < 64 && players[ i ] getStance() != "prone" && !players[ i ] maps\_laststand::player_is_in_laststand() ) // && !players[ i ].being_revived )
  1531. {
  1532. self playsound ( "perks_rattle" );
  1533. while( 1 )
  1534. {
  1535. if ( distance( players[ i ].origin, self.origin ) >= 64 || players[ i ] maps\_laststand::player_is_in_laststand() )
  1536. break;
  1537.  
  1538. if ( players[ i ] getStance() == "prone" && !change_collected )
  1539. {
  1540. players[ i ] maps\_zombiemode_score::add_to_player_score( 20 );
  1541. play_sound_at_pos( "purchase", players[ i ].origin );
  1542. change_collected = true;
  1543. }
  1544. wait .1;
  1545. }
  1546. }
  1547. }
  1548. wait .1;
  1549. }
  1550. }
  1551.  
  1552. // DONE =============================
  1553. harrybo21_perks_ignore_power( perk )
  1554. {
  1555. level.zombie_perks[ perk ].ignore_power = true;
  1556. vending_machines = harrybo21_perks_get_machines();
  1557. for ( i = 0; i < vending_machines.size; i++ )
  1558. {
  1559. if ( isDefined( vending_machines[ i ].script_string ) && vending_machines[ i ].script_string == perk )
  1560. {
  1561. vending_machines[ i ].ignore_power = true;
  1562. vending_machines[ i ] thread harrybo21_perks_activate_machine();
  1563. }
  1564. }
  1565. }
  1566.  
  1567. // DONE =============================
  1568. harrybo21_perks_add_perk( perk_name, perk_cost, perk_model, perk_model_on, perk_shader, perk_light, perk_hint, perk_function, perk_quote, perk_bottle, perk_jingle, perk_sting )
  1569. {
  1570. if ( isDefined ( level.zombie_perks[ perk_name ] ) )
  1571. return;
  1572.  
  1573. PrecacheModel( perk_model );
  1574. PrecacheModel( perk_model_on );
  1575. PrecacheShader( perk_shader );
  1576.  
  1577. struct = SpawnStruct();
  1578. struct.perk_name = perk_name;
  1579. struct.perk_hint = "Press & hold ^6&&1^7 to buy " + perk_hint + " [Cost: " + perk_cost + "]";
  1580. struct.perk_model = perk_model;
  1581. struct.perk_model_on = perk_model_on;
  1582. struct.perk_shader = perk_shader;
  1583. struct.perk_quote = perk_quote;
  1584. struct.perk_function = perk_function;
  1585. struct.perk_light = perk_light;
  1586. struct.perk_bottle = perk_bottle;
  1587. struct.perk_jingle = perk_jingle;
  1588. struct.perk_sting = perk_sting;
  1589. struct.perk_cost = perk_cost;
  1590.  
  1591. level.wonderfizz_perks[ level.wonderfizz_perks.size ] = perk_name;
  1592.  
  1593. level.zombie_perks[ perk_name ] = struct;
  1594. }
  1595.  
  1596. // DONE =============================
  1597. harrybo21_perks_remove_perk( perk_name )
  1598. {
  1599. vending_machines = harrybo21_perks_get_machines();
  1600. for ( i = 0; i < vending_machines.size; i++ )
  1601. {
  1602. if ( vending_machines[ i ].script_string == perk_name )
  1603. {
  1604. vending_machines[ i ] setmodel( level.zombie_perks[ perk_name ].perk_model_on );
  1605. vending_machines[ i ] thread harrybo21_perks_remove_perk_machine();
  1606. }
  1607. }
  1608. }
  1609.  
  1610. // DONE =============================
  1611. harrybo21_perks_limit_perk_usage( perk, limit )
  1612. {
  1613. for ( i = 0; i < limit; i++ )
  1614. level waittill( perk + "_drank" );
  1615.  
  1616. vending_machines = harrybo21_perks_get_machines();
  1617. for ( i = 0; i < vending_machines.size; i++ )
  1618. {
  1619. if ( isDefined( vending_machines[ i ].script_string ) && vending_machines[ i ].script_string == perk )
  1620. vending_machines[ i ] thread harrybo21_perks_remove_perk_machine();
  1621.  
  1622. }
  1623. level.zombie_perks[ vending_machines[ i ].script_string ].removed = true;
  1624. }
  1625.  
  1626. // DONE =============================
  1627. harrybo21_perks_limit_machine_usage( limit )
  1628. {
  1629. count = limit;
  1630. while( count > 0 )
  1631. {
  1632. self waittill( "machine_used" );
  1633. count--;
  1634. }
  1635. self thread harrybo21_perks_remove_perk_machine();
  1636. }
  1637.  
  1638. // DONE =============================
  1639. harrybo21_perks_remove_perk_machine()
  1640. {
  1641. wait 2;
  1642. self playSound( "ann_vox_laugh_l" );
  1643. self.active = false;
  1644. self harrybo21_vulture_hud_manage_fx( false );
  1645. self vibrate( ( 0, -100, 0 ) , 0.3, 0.4, 3 );
  1646. wait 3;
  1647. self moveZ( 40, 4, 3 );
  1648. wait 3;
  1649. playfx( level._effect[ "poltergeist" ], self.origin );
  1650. self.clip delete();
  1651. self.trig delete();
  1652. if ( isDefined( self.light_location ) )
  1653. self.light_location delete();
  1654.  
  1655. self notify( "machine_removed" );
  1656. self delete();
  1657. }
  1658.  
  1659. // DONE =============================
  1660. harrybo21_perks_activate_machine()
  1661. {
  1662. while ( isDefined( self.swapping_machine ) && self.swapping_machine && isDefined( level.is_swapping ) && level.is_swapping )
  1663. wait .1;
  1664.  
  1665. self endon( "machine_removed" );
  1666. self.active = true;
  1667. self setmodel( level.zombie_perks[ self.script_string ].perk_model_on );
  1668. self vibrate( ( 0, -100, 0 ) , 0.3, 0.4, 3 );
  1669. self playsound( "perks_power_on" );
  1670.  
  1671. self.light_location = spawn( "script_model", self.origin + ( anglesToForward( self.angles + ( 0, 90, 0 ) ) * -0 ) );
  1672. self.light_location.angles = ( self.angles + ( 0, 0, 0 ) );
  1673. self.light_location setModel( "tag_origin" );
  1674. self.light_location playLoopSound( "perks_machine_loop" );
  1675. PlayFxOnTag( level.zombie_perks[ self.script_string ].perk_light, self.light_location, "tag_origin" );
  1676.  
  1677. self.trig SetHintString( level.zombie_perks[ self.script_string ].perk_hint );
  1678. self harrybo21_vulture_hud_manage_fx( true );
  1679. self notify( "machine_activated" );
  1680. }
  1681.  
  1682. // DONE =============================
  1683. harrybo21_perks_deactivate_machine()
  1684. {
  1685. self.active = false;
  1686. self setmodel( level.zombie_perks[ self.script_string ].perk_model );
  1687. self.light_location stopLoopSound( "perks_machine_loop" );
  1688. self.light_location delete();
  1689. self.trig SetHintString( &"ZOMBIE_FLAMES_UNAVAILABLE" );
  1690. self harrybo21_vulture_hud_manage_fx( false );
  1691. self notify( "machine_turned_off" );
  1692. }
  1693.  
  1694. // DONE =============================
  1695. harryb21_perks_trigger_visible_watcher( machine )
  1696. {
  1697. self endon( "machine_removed" );
  1698. while( 1 )
  1699. {
  1700. players = get_players();
  1701. for ( i = 0; i < players.size; i++ )
  1702. {
  1703. if ( ( isDefined( self.swapping_machine ) && isDefined( level.is_swapping ) && level.is_swapping ) || ( isDefined( players[ i ].is_drinking ) && players[ i ].is_drinking ) || players[ i ] hasPerk( machine.script_string ) || players[ i ] maps\_laststand::player_is_in_laststand()
  1704. || players[ i ].perk_inventory.size >= players[ i ].max_perks || ( isDefined( players[ i ].last_stand ) && players[ i ].last_stand ) || players[ i ] isThrowingGrenade() || players[ i ] isSwitchingWeapons() )
  1705. self.trig SetInvisibleToPlayer( players[ i ], true );
  1706. else
  1707. self.trig SetInvisibleToPlayer( players[ i ], false );
  1708. }
  1709. wait .1;
  1710. }
  1711. }
  1712.  
  1713. // DONE =============================
  1714. harrybo21_perks_trigger_watcher( machine )
  1715. {
  1716. machine endon( "machine_removed" );
  1717. machine waittill( "machine_activated" );
  1718. while( 1 )
  1719. {
  1720. player = undefined;
  1721. self waittill( "trigger", player );
  1722.  
  1723. if ( !machine.active || ( isDefined( player.is_drinking ) && player.is_drinking ) || player hasPerk( machine.script_string ) || player maps\_laststand::player_is_in_laststand()
  1724. || player.perk_inventory.size >= player.max_perks || player isThrowingGrenade() || player isSwitchingWeapons() )
  1725. {
  1726. wait .1;
  1727. continue;
  1728. }
  1729. if ( player.score < level.zombie_perks[ machine.script_string ].perk_cost )
  1730. {
  1731. machine playsound( "deny" );
  1732. player thread harry_powerup_quotes( "nomoney_generic_d_" );
  1733. continue;
  1734. }
  1735.  
  1736. player.is_drinking = 1;
  1737. player maps\_zombiemode_score::minus_to_player_score( level.zombie_perks[ machine.script_string ].perk_cost );
  1738. playsoundatposition( "bottle_dispense3d", machine.origin );
  1739. player thread harrybo21_perks_bottle_drink( machine.script_string );
  1740. machine playSound( level.zombie_perks[ machine.script_string ].perk_sting, "sound_done", true );
  1741. machine notify( machine.script_string + "_drank" );
  1742. level notify( machine.script_string + "_drank" );
  1743. machine notify( "machine_used" );
  1744. }
  1745. }
  1746.  
  1747. // DONE =============================
  1748. harrybo21_perks_bottle_drink( perk )
  1749. {
  1750. while ( self isSwitchingWeapons() )
  1751. wait .1;
  1752.  
  1753. index = level.zombie_perks[ perk ].perk_bottle;
  1754. gun = undefined;
  1755. self _disableOffhandWeapons();
  1756. self DisableWeaponCycling();
  1757. self AllowLean( false );
  1758. self AllowAds( false );
  1759. self AllowSprint( false );
  1760. self AllowProne( false );
  1761. self AllowMelee( false );
  1762. if ( level.zombie_vars[ "deadshot_laser" ] && self hasPerk( "specialty_bulletaccuracy" ) )
  1763. self setClientDvar( "cg_laserForceOn", 0 );
  1764.  
  1765. if( self GetStance() == "prone" )
  1766. self SetStance( "crouch" );
  1767.  
  1768. gun = self GetCurrentWeapon();
  1769. self GiveWeapon( "zombie_bo2_perk_bottles", index );
  1770. self SwitchToWeapon( "zombie_bo2_perk_bottles" );
  1771. self waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" );
  1772.  
  1773. self TakeWeapon( "zombie_bo2_perk_bottles" );
  1774.  
  1775. self SwitchToWeapon( gun );
  1776.  
  1777. self thread harrybo21_perks_give( perk );
  1778.  
  1779. while ( self isSwitchingWeapons() )
  1780. wait .1;
  1781.  
  1782. self _enableOffhandWeapons();
  1783. self EnableWeaponCycling();
  1784. self AllowLean( true );
  1785. self AllowAds( true );
  1786. self AllowSprint( true );
  1787. self AllowProne( true );
  1788. self AllowMelee( true );
  1789. self waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" );
  1790. self.is_drinking = undefined;
  1791. if ( level.zombie_vars[ "deadshot_laser" ] && self hasPerk( "specialty_bulletaccuracy" ) )
  1792. self setClientDvar( "cg_laserForceOn", 1 );
  1793.  
  1794. self thread harrybo21_vending_play_quote( perk );
  1795.  
  1796. self notify( "machine_used" );
  1797. }
  1798.  
  1799. // REVIEW =============================
  1800. harrybo21_perks_give( perk )
  1801. {
  1802. if ( self maps\_laststand::player_is_in_laststand() )
  1803. return;
  1804.  
  1805. // self thread harry_powerup_quotes( level.zombie_perks[ perk ].perk_quote );
  1806. self harrybo21_perks_give_perk( perk );
  1807. self setblur( 4, .1 );
  1808. wait .1;
  1809. self setblur( 0, .1 );
  1810. }
  1811.  
  1812. // DONE =============================
  1813. harrybo21_perks_give_perk( perk )
  1814. {
  1815. self notify( "obtained_" + perk );
  1816. if ( self hasPerk( perk ) )
  1817. return;
  1818.  
  1819. self.perk_inventory[ self.perk_inventory.size ] = perk;
  1820. self thread harrybo21_perks_hud_set( perk );
  1821. if ( !self.immune_to_powerdown && isDefined( level.power_on ) && !level.power_on && !harrybo21_perks_is_machine_for_perk_active( perk ) )
  1822. return;
  1823.  
  1824. self setPerk( perk );
  1825. if ( isDefined( level.zombie_perks[ perk ].perk_function ) )
  1826. self thread [[ level.zombie_perks[ perk ].perk_function ]]( true );
  1827. }
  1828.  
  1829. // DONE =============================
  1830. harrybo21_perks_take_perk( perk )
  1831. {
  1832. for ( i = 0; i < self.perk_inventory.size; i++ )
  1833. {
  1834. if ( self.perk_inventory[ i ] == perk )
  1835. self.perk_inventory = array_remove( self.perk_inventory, self.perk_inventory[ i ] );
  1836.  
  1837. }
  1838. self unSetPerk( perk );
  1839. self harrybo21_perks_hud_remove( perk );
  1840. if ( isDefined( level.zombie_perks[ perk ].perk_function ) )
  1841. self thread [[ level.zombie_perks[ perk ].perk_function ]]( false );
  1842. }
  1843.  
  1844. // DONE =============================
  1845. harrybo21_perks_hud_set( perk )
  1846. {
  1847. if ( !isDefined( self.perk_hud ) )
  1848. self.perk_hud = [];
  1849.  
  1850. hud = NewClientHudElem( self );
  1851. hud.perk = perk;
  1852. hud.foreground = true;
  1853. hud.sort = 1;
  1854. hud.hidewheninmenu = false;
  1855. hud.alignX = "left";
  1856. hud.alignY = "bottom";
  1857. hud.horzAlign = "left";
  1858. hud.vertAlign = "bottom";
  1859. hud.x = self.perk_hud.size * 30;
  1860. hud.y = hud.y - 70;
  1861. // hud.x = 0; // For vertical shaders
  1862. // hud.y = 0 - 70 - ( self.perk_hud.size * 30 ); // For vertical shaders
  1863. hud.alpha = 0;
  1864. hud SetShader( level.zombie_perks[ perk ].perk_shader , 48, 48 );
  1865. hud scaleOverTime( .5, 24, 24 );
  1866. hud fadeOverTime( .5 );
  1867. hud.alpha = 1;
  1868. self.perk_hud[ self.perk_hud.size ] = hud;
  1869. }
  1870.  
  1871. // DONE =============================
  1872. harrybo21_perks_hud_fade_power_off( perk )
  1873. {
  1874. if ( !isDefined( self.perk_hud ) || self.perk_hud.size < 1 )
  1875. return;
  1876.  
  1877. for ( i = 0; i < self.perk_hud.size; i++ )
  1878. {
  1879. if ( self.perk_hud[ i ].perk != perk )
  1880. continue;
  1881.  
  1882. self.perk_hud[ i ] fadeOverTime( .5 );
  1883. self.perk_hud[ i ].alpha = .25;
  1884.  
  1885. }
  1886. }
  1887.  
  1888. // DONE =============================
  1889. harrybo21_perks_hud_fade_power_on( perk )
  1890. {
  1891. if ( !isDefined( self.perk_hud ) || self.perk_hud.size < 1 )
  1892. return;
  1893.  
  1894. for ( i = 0; i < self.perk_hud.size; i++ )
  1895. {
  1896. if ( self.perk_hud[ i ].perk != perk )
  1897. continue;
  1898.  
  1899. self.perk_hud[ i ] fadeOverTime( .5 );
  1900. self.perk_hud[ i ].alpha = 1;
  1901.  
  1902. }
  1903. }
  1904.  
  1905. // DONE =============================
  1906. harrybo21_perks_hud_remove( perk )
  1907. {
  1908. new_array = [];
  1909. for ( i = 0; i < self.perk_hud.size; i++ )
  1910. {
  1911. if ( self.perk_hud[ i ].perk == perk )
  1912. self.perk_hud[ i ] thread maps\_harrybo21_utilities::harry_fade_hud( .5, 0 );
  1913. else
  1914. new_array[ new_array.size ] = self.perk_hud[ i ];
  1915.  
  1916. }
  1917. self.perk_hud = new_array;
  1918. for ( i = 0; i < self.perk_hud.size; i++ )
  1919. self.perk_hud[ i ] maps\_harrybo21_utilities::harry_move_hud( .5, 0 + ( i * 30 ), self.perk_hud[ i ].y );
  1920.  
  1921. }
  1922.  
  1923. // DONE =============================
  1924. harrybo21_perks_get_hud_index( perk )
  1925. {
  1926. for ( i = 0; i < self.perk_hud.size; i++ )
  1927. {
  1928. if ( self.perk_hud[ i ].perk == perk )
  1929. return i;
  1930.  
  1931. }
  1932. return undefined;
  1933. }
  1934.  
  1935. // DONE =============================
  1936. harrybo21_perks_remove_all()
  1937. {
  1938. if ( !isDefined( self.perk_inventory ) || self.perk_inventory.size < 1 )
  1939. return;
  1940.  
  1941. take = [];
  1942. for( p = 0; p < self.perk_inventory.size; p++ )
  1943. take[ take.size ] = self.perk_inventory[ p ];
  1944.  
  1945.  
  1946. for( p = 0; p < take.size; p++ )
  1947. self harrybo21_perks_take_perk( take[ p ] );
  1948.  
  1949. if (self hasPerk ( "specialty_boost" ))
  1950. {
  1951. self harrybo21_perks_hud_remove( "specialty_boost" );
  1952. iPrintLnBold("lost cherry");
  1953. }
  1954. }
  1955.  
  1956. // REVIEW =============================
  1957. harrybo21_perks_play_jingle()
  1958. {
  1959. self endon( "machine_turned_off" );
  1960. while( 1 )
  1961. {
  1962. wait randomInt( level.zombie_vars[ "perk_jingle_wait_min" ], level.zombie_vars[ "perk_jingle_wait_max" ] );
  1963. if ( isDefined( level.perk_jingle_playing ) || !self.active )
  1964. {
  1965. wait 1;
  1966. continue;
  1967. }
  1968. if ( randomInt( 100 ) > 15 )
  1969. {
  1970. if ( isDefined( level.zombie_perks[ self.script_string ].perk_jingle ) )
  1971. {
  1972. self playsound( level.zombie_perks[ self.script_string ].perk_jingle, "sound_done", true );
  1973. self waittill( "sound_done" );
  1974. }
  1975. else
  1976. {
  1977. wait( randomfloatrange( 7, 18 ) );
  1978. playsoundatposition ( "broken_random_jingle", self.origin );
  1979. playsoundatposition ( "electrical_surge", self.origin );
  1980. }
  1981. }
  1982. }
  1983. }
  1984.  
  1985. // REVIEW =============================
  1986. harrybo21_vending_play_quote( type )
  1987. {
  1988. /*
  1989. self endon("death");
  1990. self endon("disconnect");
  1991.  
  1992. index = maps\_zombiemode_weapons::get_player_index( self );
  1993. sound = undefined;
  1994.  
  1995. if( isdefined( level.player_is_speaking ) && level.player_is_speaking )
  1996. return;
  1997.  
  1998. player_index = "vox_plr_" + index + "_";
  1999.  
  2000. switch( type )
  2001. {
  2002. case "specialty_armorvest":
  2003. sound_to_play = "perk_jugga_d_0";
  2004. break;
  2005. case "specialty_fastreload":
  2006. sound_to_play = "perk_speed_d_0";
  2007. break;
  2008. case "specialty_quickrevive":
  2009. sound_to_play = "perk_revive_d_0";
  2010. break;
  2011. case "specialty_rof":
  2012. sound_to_play = "perk_tap_d_0";
  2013. break;
  2014. case "specialty_detectexplosive":
  2015. sound_to_play = "perk_phdflopper_d_0";
  2016. break;
  2017. case "specialty_extraammo":
  2018. sound_to_play = "perk_mule_d_0";
  2019. break;
  2020. case "specialty_longersprint":
  2021. sound_to_play = "perk_stamine_d_0";
  2022. break;
  2023. case "specialty_bulletaccuracy":
  2024. sound_to_play = "perk_deadshot_d_0";
  2025. break;
  2026. case "specialty_upgrade":
  2027. rand = randomInt( 5 );
  2028. sound_to_play = "pap_arm_d_" + rand;
  2029. break;
  2030. case "nomoney":
  2031. rand = randomInt( 5 );
  2032. sound_to_play = "nomoney_generic_d_" + rand;
  2033. break;
  2034. default:
  2035. return;
  2036. }
  2037.  
  2038. wait 1;
  2039. self playSound( player_index + sound_to_play, "sound_done" );
  2040. self waittill( "sound_done" );
  2041. level.player_is_speaking = undefined;
  2042. */
  2043. }
  2044.  
  2045. // REVIEW =============================
  2046. harrybo21_perks_fake_death()
  2047. {
  2048. level notify( "fake_death" );
  2049. self notify( "fake_death" );
  2050.  
  2051. self setClientDvar( "has_retriever", 0 );
  2052. self setClientDvar( "retriever_charged", 0 );
  2053. self.ignoreme = true;
  2054. self EnableInvulnerability();
  2055. self SetStance( "prone" );
  2056. self AllowStand( false );
  2057. self AllowCrouch( false );
  2058. self AllowSprint( false );
  2059. self AllowProne( true );
  2060. self harrybo21_perks_remove_all();
  2061. self setactionslot( 1, "", undefined );
  2062. self setactionslot( 2, "", undefined );
  2063. self setactionslot( 3, "", undefined );
  2064. self setactionslot( 4, "", undefined );
  2065. self takeallweapons();
  2066. if ( !is_coop() )
  2067. {
  2068. self giveWeapon( level.zombie_vars[ "last_stand_pistol" ] );
  2069. self SwitchToWeapon( level.zombie_vars[ "last_stand_pistol" ] );
  2070. self giveWeapon( "bo2_zm_frag_grenade" );
  2071. self setWeaponAmmoClip( "bo2_zm_frag_grenade", 2 );
  2072. }
  2073. else
  2074. {
  2075. self giveWeapon( level.zombie_vars[ "start_pistol" ] );
  2076. self SwitchToWeapon( level.zombie_vars[ "start_pistol" ] );
  2077. self giveWeapon( "bo2_zm_frag_grenade" );
  2078. self setWeaponAmmoClip( "bo2_zm_frag_grenade", 2 );
  2079. }
  2080. self VisionSetNaked( "laststand" );
  2081. }
  2082.  
  2083. // REVIEW =============================
  2084. harrybo21_perks_player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
  2085. {
  2086. if( sMeansOfDeath == "MOD_FALLING" )
  2087. {
  2088. sMeansOfDeath = "MOD_EXPLOSIVE";
  2089. }
  2090.  
  2091. if( isDefined( eAttacker ) )
  2092. {
  2093. if( isDefined( self.ignoreAttacker ) && self.ignoreAttacker == eAttacker )
  2094. {
  2095. return;
  2096. }
  2097.  
  2098. if( isDefined( eAttacker.is_zombie ) && eAttacker.is_zombie )
  2099. {
  2100. self.ignoreAttacker = eAttacker;
  2101. self thread maps\_zombiemode::remove_ignore_attacker();
  2102. }
  2103.  
  2104. if( isDefined( eAttacker.damage_mult ) )
  2105. {
  2106. iDamage *= eAttacker.damage_mult;
  2107. }
  2108. eAttacker notify( "hit_player" );
  2109. }
  2110. finalDamage = iDamage;
  2111.  
  2112. if( sMeansOfDeath == "MOD_PROJECTILE" || sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" )
  2113. {
  2114. if( self.health > 75 )
  2115. {
  2116. finalDamage = 75;
  2117. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2118. return;
  2119. }
  2120. }
  2121.  
  2122. if( iDamage < self.health )
  2123. {
  2124. if ( IsDefined( eAttacker ) )
  2125. eAttacker.sound_damage_player = self;
  2126.  
  2127. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2128. return;
  2129. }
  2130. if( level.intermission )
  2131. {
  2132. level waittill( "forever" );
  2133. }
  2134.  
  2135. players = get_players();
  2136. count = 0;
  2137. for( i = 0; i < players.size; i++ )
  2138. {
  2139. if( players[i] == self || players[i].is_zombie || players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator" )
  2140. count++;
  2141.  
  2142. }
  2143.  
  2144. if( count < players.size )
  2145. {
  2146. // self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2147. // return;
  2148. }
  2149. perk_stands = undefined;
  2150. if ( self hasPerk( "specialty_shades" ) )
  2151. {
  2152. perk_stands = "specialty_shades";
  2153. }
  2154. else if ( self hasPerk( "specialty_reconnaissance" ) )
  2155. {
  2156. perk_stands = "specialty_reconnaissance";
  2157. }
  2158. else if ( self hasPerk( "specialty_quickrevive" ) && !is_coop() )
  2159. {
  2160. // iPrintLnBold( "has quick revive" );
  2161. perk_stands = "specialty_quickrevive";
  2162. }
  2163. self.intermission = true;
  2164. self.loadout = self harrybo21_collect_loadout();
  2165. // iPrintLnBold( "^1Last stand - loadout collected" );
  2166. self maps\_laststand::PlayerLastStand( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime );
  2167.  
  2168. self harrybo21_perks_fake_death();
  2169.  
  2170. if ( isDefined( perk_stands ) && perk_stands == "specialty_shades" )
  2171. return harrybo21_perks_whos_who_laststand();
  2172. else if ( isDefined( perk_stands ) && perk_stands == "specialty_reconnaissance" )
  2173. return harrybo21_perks_tombstone_activate();
  2174. else if ( isDefined( perk_stands ) && perk_stands == "specialty_quickrevive" )
  2175. return harrybo21_perks_revive_auto_revive();
  2176.  
  2177. // self harrybo21_perks_remove_all();
  2178.  
  2179. if( count == players.size )
  2180. {
  2181. level notify( "end_game" );
  2182. harrybo21_perks_end_game_hands();
  2183. }
  2184. else
  2185. self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
  2186.  
  2187. }
  2188.  
  2189. // REVIEW =============================
  2190. harrybo21_perks_player_revive()
  2191. {
  2192. self notify ( "player_revived", self );
  2193. self reviveplayer();
  2194.  
  2195. self.revives++;
  2196. self.stats[ "revives" ] = self.revives;
  2197.  
  2198. self harrybo21_return_loadout( self.loadout, self.loadout.perk_inventory );
  2199.  
  2200. self thread maps\_laststand::say_revived_vo();
  2201. self.revivetrigger delete();
  2202. self.revivetrigger = undefined;
  2203. self.health = self.maxhealth;
  2204. self AllowStand( true );
  2205. self AllowCrouch( true );
  2206. self AllowProne( true );
  2207. self AllowSprint( true );
  2208. self SetStance( "stand" );
  2209. self DisableInvulnerability();
  2210. self EnableWeaponCycling();
  2211. self _enableOffhandWeapons();
  2212. self freezecontrols( false );
  2213. self.being_revived = false;
  2214. self.ignoreme = false;
  2215. self.revived = true;
  2216. wait .1;
  2217. if ( isDefined( self.whos_who_active ) )
  2218. self VisionSetNaked( "zombie_whos_who", 1 );
  2219. else
  2220. {
  2221. self VisionSetNaked( level.zombie_vars[ "vision_file" ], 1 );
  2222. setClientSysState( "lsm", "0", self );
  2223. }
  2224. // iPrintLnBold( "^1Last stand - loadout returned" );
  2225. }
  2226.  
  2227. // REVIEW =============================
  2228. harrybo21_perks_player_fake_revive()
  2229. {
  2230. self reviveplayer();
  2231. self AllowStand( true );
  2232. self AllowCrouch( true );
  2233. self AllowProne( true );
  2234. self AllowSprint( true );
  2235. self SetStance( "stand" );
  2236. self DisableInvulnerability();
  2237. self EnableWeaponCycling();
  2238. self _enableOffhandWeapons();
  2239. self freezecontrols( false );
  2240. self.revivetrigger delete();
  2241. self.health = self.maxhealth;
  2242. self.revivetrigger = undefined;
  2243. self.being_revived = false;
  2244. self.ignoreme = false;
  2245. self.revived = true;
  2246. self stopLoopSound();
  2247. self VisionSetNaked( level.zombie_vars[ "vision_file" ], 1 );
  2248. setClientSysState( "lsm", "0", self );
  2249. }
  2250.  
  2251. // REVIEW =============================
  2252. harrybo21_perks_end_game_hands()
  2253. {
  2254. players = get_players();
  2255. for ( i = 0; i < players.size; i++ )
  2256. {
  2257. players[ i ] takeallweapons();
  2258. players[ i ] giveWeapon( "zombie_downed" );
  2259. players[ i ] SwitchToWeapon( "zombie_downed" );
  2260. players[ i ] VisionSetNaked( level.zombie_vars[ "vision_file" ], 1 );
  2261. players[ i ] SetStance( "prone" );
  2262. players[ i ] EnableInvulnerability();
  2263. players[ i ].ignoreme = true;
  2264. players[ i ] DisableWeaponCycling();
  2265. players[ i ] _disableOffhandWeapons();
  2266. players[ i ] freezecontrols( true );
  2267. }
  2268. }
  2269.  
  2270. // DONE =============================
  2271. harrybo21_perks_is_perk_in_game( perk )
  2272. {
  2273. keys = getArrayKeys( level.zombie_perks );
  2274. if ( !isDefined( keys ) || keys.size < 1 )
  2275. return false;
  2276.  
  2277. for ( i = 0; i < keys.size; i++ )
  2278. {
  2279. if ( keys[ i ] == perk )
  2280. return true;
  2281.  
  2282. }
  2283. return false;
  2284. }
  2285.  
  2286. harrybo21_perks_do_gib( plr )
  2287. {
  2288. chance = 58;
  2289. if ( level.round_number > 15 )
  2290. chance = 38;
  2291. if ( level.round_number > 24 )
  2292. chance = 10;
  2293.  
  2294. shouldGib = randomIntRange( 0,100 ) < chance;
  2295. gibType = strtok( "legs:head:arm",":" );
  2296.  
  2297. if( ( isdefined( self.boss ) && self.boss ) || self.animname == "jnaut_melee" || self.animname == "jnaut_gunner" || ( isDefined( self.boss_mech ) && self.boss_mech ) || ( isDefined( self.animname ) && self.animname == "boss_zombie" ) || ( isDefined( self.animname ) && self.animname == "sonic_zombie" ) )
  2298. return;
  2299.  
  2300. if ( shouldGib && !isdefined( self.boss ) )
  2301. {
  2302. switch( gibType[ randomIntRange( 0, gibType.size ) ] )
  2303. {
  2304. case "legs":
  2305. {
  2306. self thread maps\_zombiemode_spawner::make_crawler();
  2307. break;
  2308. }
  2309. case "head":
  2310. {
  2311. self thread maps\_zombiemode_spawner::zombie_head_gib( plr );
  2312. break;
  2313. }
  2314. case "arm":
  2315. {
  2316. refs = [];
  2317. refs[ refs.size ] = "guts";
  2318. refs[ refs.size ] = "right_arm";
  2319. refs[ refs.size ] = "left_arm";
  2320. self.a.gib_ref = animscripts\death::get_random( refs );
  2321. break;
  2322. }
  2323. }
  2324. self thread animscripts\death::do_gib();
  2325. }
  2326. }
  2327.  
  2328. // Perks Functionality ==============================================================================================
  2329.  
  2330. // Speed Functionality ( "specialty_quickrevive" ) ==============================================================================================
  2331.  
  2332. harrybo21_perks_revive( give )
  2333. {
  2334. self endon( "disconnect" );
  2335. if ( isDefined( give ) && give )
  2336. {
  2337. // what to do when perk is given
  2338. }
  2339. else
  2340. {
  2341. // what to do when perk is lost
  2342. self notify( "lost_specialty_quickrevive" );
  2343. }
  2344. }
  2345.  
  2346. harrybo21_perks_revive_laststand_check()
  2347. {
  2348. if ( isDefined( self.revive_last_stand ) && self.revive_last_stand )
  2349. return true;
  2350. else
  2351. return false;
  2352. }
  2353.  
  2354. harrybo21_perks_revive_auto_revive()
  2355. {
  2356.  
  2357. // self thread maps\_laststand::laststand_give_grenade();
  2358.  
  2359. self.revive_hud setText( &"GAME_PLAYER_IS_REVIVING_YOU", self );
  2360. self thread maps\_laststand::revive_hud_show_n_fade( level.zombie_vars[ "solo_revive_time" ] );
  2361.  
  2362. if( !isdefined( self.reviveProgressBar ) )
  2363. self.reviveProgressBar = self createPrimaryProgressBar();
  2364.  
  2365. self.reviveProgressBar updateBar( 0.01, 1 / level.zombie_vars[ "solo_revive_time" ] );
  2366.  
  2367. wait level.zombie_vars[ "solo_revive_time" ];
  2368.  
  2369. if( isdefined( self.reviveProgressBar ) )
  2370. self.reviveProgressBar destroyElem();
  2371.  
  2372. self harrybo21_perks_player_revive();
  2373. }
  2374.  
  2375. // Jugg Functionality ( "specialty_armorvest" ) ==============================================================================================
  2376.  
  2377. harrybo21_perks_juggernog( give )
  2378. {
  2379. self endon( "disconnect" );
  2380. if ( isDefined( give ) && give )
  2381. {
  2382. self.maxhealth = level.zombie_vars[ "juggernog_health_max" ];
  2383. self.health = level.zombie_vars[ "juggernog_health_max" ];
  2384. }
  2385. else
  2386. {
  2387. self.maxhealth = level.zombie_vars[ "juggernog_health_normal" ];
  2388. self.health = level.zombie_vars[ "juggernog_health_normal" ];
  2389. self notify( "lost_specialty_armorvest" );
  2390. }
  2391. }
  2392.  
  2393. // Speed Functionality ( "specialty_fastreload" ) ==============================================================================================
  2394.  
  2395. harrybo21_perks_speed( give )
  2396. {
  2397. self endon( "disconnect" );
  2398. if ( isDefined( give ) && give )
  2399. {
  2400. }
  2401. else
  2402. {
  2403. self notify( "lost_specialty_fastreload" );
  2404. }
  2405. }
  2406.  
  2407. // Double Tap 2.0 Functionality ( "specialty_rof" ) ==============================================================================================
  2408.  
  2409. harrybo21_perks_doubletap( give )
  2410. {
  2411. self endon( "disconnect" );
  2412. if ( isDefined( give ) && give )
  2413. {
  2414. }
  2415. else
  2416. {
  2417. self.attacker.doubletap_hit = undefined;
  2418. self notify( "lost_specialty_rof" );
  2419. }
  2420. }
  2421.  
  2422. harrybo21_perks_doubletap_damage( amount, origin, attacker, location, direction_vec, point, type )
  2423. {
  2424. self endon( "death" );
  2425. self.damageLocation = location;
  2426. wait_network_frame();
  2427. self doDamage( amount, origin, attacker );
  2428. self.damageLocation = location;
  2429. // iPrintLn( location );
  2430. wait_network_frame();
  2431. }
  2432.  
  2433. harrybo21_perks_doubletap_watcher()
  2434. {
  2435. self endon( "death" );
  2436. while( 1 )
  2437. {
  2438. self waittill( "damage", amount, attacker, direction_vec, point, type );
  2439.  
  2440. if ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" || ( isDefined( self.damageWeapon ) && WeaponClass( self.damageWeapon ) == "spread" ) )
  2441. {
  2442. if( isDefined( attacker ) && isplayer( attacker ) && isAlive( attacker ) )
  2443. {
  2444. if( attacker hasPerk( "specialty_rof" ) )
  2445. self harrybo21_perks_doubletap_damage( amount, self.origin, attacker, self.damageLocation );
  2446. if ( ( self.damageLocation == "head" || self.damageLocation == "helmet" ) && attacker hasPerk( "specialty_bulletaccuracy" ) )
  2447. self harrybo21_perks_deadshot_damage( amount, attacker, type, self.damageLocation );
  2448.  
  2449. }
  2450. }
  2451. wait_network_frame();
  2452. }
  2453. }
  2454.  
  2455. // Deadshot Functionality ( "specialty_bulletaccuracy" ) ==============================================================================================
  2456.  
  2457. harrybo21_perks_deadshot( give )
  2458. {
  2459. self endon( "disconnect" );
  2460. if ( isDefined( give ) && give )
  2461. {
  2462. self setClientDvar( "cg_laserForceOn", level.zombie_vars[ "deadshot_laser" ] );
  2463. self setClientDvar( "cg_laserRadius", level.zombie_vars[ "deadshot_laser_radius" ] );
  2464. self setClientDvar( "cg_laserLightRadius", 0.4, level.zombie_vars[ "deadshot_light_radius" ] );
  2465. self setClientDvar( "perk_weapSpreadMultiplier", level.zombie_vars[ "deadshot_spread_multiplier" ] );
  2466. }
  2467. else
  2468. {
  2469. self.attacker.deadshot_hit = undefined;
  2470. self setClientDvar( "cg_laserForceOn", 0 );
  2471. self setClientDvar( "perk_weapSpreadMultiplier", 0.65 );
  2472. self notify( "lost_specialty_bulletaccuracy" );
  2473. }
  2474. }
  2475.  
  2476. harrybo21_perks_deadshot_damage( amount, origin, attacker, location )
  2477. {
  2478. self endon( "death" );
  2479. self.deadshot_hit = true;
  2480. new_damage = amount / 4;
  2481. if ( attacker hasPerk( "specialty_rof" ) )
  2482. new_damage = new_damage * 2;
  2483.  
  2484. if ( new_damage > self.health )
  2485. {
  2486. score = level.zombie_vars[ "deadshot_point_reward" ];
  2487. if ( isDefined( level.zombie_vars["zombie_powerup_point_doubler_on"] ) && level.zombie_vars["zombie_powerup_point_doubler_on"] )
  2488. score = score * 2;
  2489.  
  2490. attacker maps\_zombiemode_score::add_to_player_score( score );
  2491. }
  2492. self.damageLocation = location;
  2493. wait_network_frame();
  2494. self doDamage( new_damage, origin, attacker );
  2495. wait_network_frame();
  2496. self.deadshot_hit = undefined;
  2497. }
  2498.  
  2499. // Stamin-Up Functionality ( "specialty_longersprint" ) ==============================================================================================
  2500.  
  2501. harrybo21_perks_staminup( give )
  2502. {
  2503. self endon( "disconnect" );
  2504. if ( isDefined( give ) && give )
  2505. {
  2506. self setmovespeedscale( level.zombie_vars[ "staminup_sprint_scale" ] );
  2507. self setClientDvar( "player_sprintTime" , level.zombie_vars[ "staminup_sprint_max_duration" ] );
  2508. }
  2509. else
  2510. {
  2511. self setmovespeedscale( 1 );
  2512. self setClientDvar( "player_sprintTime" , 4 );
  2513. self notify( "lost_specialty_longersprint" );
  2514. }
  2515. }
  2516.  
  2517. // PHD Functionality ( "specialty_detectexplosive" ) ==============================================================================================
  2518.  
  2519. harrybo21_perks_phd( give )
  2520. {
  2521. self endon( "disconnect" );
  2522. if ( isDefined( give ) && give )
  2523. {
  2524. self thread harrybo21_perks_phd_watcher();
  2525. }
  2526. else
  2527. {
  2528. self notify( "phd_lost" );
  2529. self notify( "lost_specialty_detectexplosive" );
  2530. }
  2531. }
  2532.  
  2533. harrybo21_perks_phd_watcher()
  2534. {
  2535. self endon( "disconnect" );
  2536. self endon( "phd_lost" );
  2537. while( 1 )
  2538. {
  2539. self waittill( "do_nuke" );
  2540.  
  2541. PlayFxOnTag( level._effect[ "phd_nuke" ], self, "tag_origin" );
  2542. self playSound( "phd_explode" );
  2543.  
  2544. ai = GetAiSpeciesArray( "axis", "all" );
  2545. for( i = 0; i < ai.size; i++ )
  2546. {
  2547. if ( distance( self.origin, ai[ i ].origin ) > level.zombie_vars[ "phd_max_range" ] )
  2548. continue;
  2549.  
  2550. ai[ i ].damagemod = "MOD_EXPLOSIVE";
  2551. fraction = level.zombie_vars[ "phd_max_range" ] / distance( self.origin, ai[ i ].origin );
  2552. damage = level.zombie_vars[ "phd_max_damage" ] - fraction;
  2553.  
  2554. if( ( isdefined( ai[ i ].boss ) && ai[ i ].boss ) || ( isDefined( ai[ i ].boss_mech ) && ai[ i ].boss_mech ) || ( isDefined( ai[ i ].animname ) && ( ai[ i ].animname == "boss_zombie" || ai[ i ].animname == "sonic_zombie" || ai[ i ].animname == "napalm_zombie" ) ) )
  2555. continue;
  2556.  
  2557. if ( isDefined( level.zombie_vars[ "zombie_powerup_insta_kill_on" ] ) && level.zombie_vars[ "zombie_powerup_insta_kill_on" ] )
  2558. damage = ai[ i ].health + 666;
  2559. if ( damage < ai[ i ].health )
  2560. ai[ i ] thread harrybo21_perks_do_gib();
  2561.  
  2562. ai[ i ] DoDamage( damage , ai[ i ].origin, self );
  2563. }
  2564. wait .1;
  2565. }
  2566. }
  2567.  
  2568. // Mule Kick Functionality ( "specialty_extraammo" ) ==============================================================================================
  2569.  
  2570. harrybo21_perks_mulekick( give )
  2571. {
  2572. self endon( "disconnect" );
  2573. if ( isDefined( give ) && give )
  2574. {
  2575. for ( i = 2; i < level.zombie_vars[ "mule_kick_max_weapons" ]; i++ )
  2576. {
  2577. if ( !isDefined( self.inventory[ i ] ) )
  2578. self.inventory[ i ] = "none";
  2579. }
  2580. wait .5;
  2581. self harrybo21_perks_mule_kick_hud_effect();
  2582. }
  2583. else
  2584. {
  2585. self notify( "lost_specialty_extraammo" );
  2586. }
  2587. }
  2588.  
  2589. harrybo21_perks_mule_kick_take_extras()
  2590. {
  2591. self.lost_mule_guns = [];
  2592. self.muleAmmo = [];
  2593. if ( !isDefined( self.inventory ) || self.inventory.size < 3 )
  2594. return;
  2595.  
  2596. current_weapon = self getCurrentWeapon();
  2597. self.mule_kick_switch_back = current_weapon;
  2598. for ( i = 2; i < self.inventory.size; i++ )
  2599. {
  2600. self.lost_mule_guns[ self.lost_mule_guns.size ] = self.inventory[ i ];
  2601. self.muleAmmo[ self.inventory[ i ] ][ "clip" ] = self GetWeaponAmmoClip( self.inventory[ i ] );
  2602. self.muleAmmo[ self.inventory[ i ] ][ "stock" ] = self GetWeaponAmmoStock( self.inventory[ i ] );
  2603.  
  2604. self takeWeapon( self.inventory[ i ] );
  2605. if ( current_weapon == self.inventory[ i ] )
  2606. self switchToWeapon( self.inventory[ 0 ] );
  2607.  
  2608. }
  2609. new_inventory = [];
  2610. for ( i = 0; i < 2; i++ )
  2611. {
  2612. new_inventory[ i ] = self.inventory[ i ];
  2613. }
  2614. self.inventory = new_inventory;
  2615. }
  2616.  
  2617. harrybo21_perks_mule_kick_return_extras()
  2618. {
  2619. if ( !isDefined( self.lost_mule_guns ) || self.lost_mule_guns.size < 1 )
  2620. return;
  2621.  
  2622. current_weapon = self getCurrentWeapon();
  2623. for ( i = 0; i < self.lost_mule_guns.size; i++ )
  2624. {
  2625. self.inventory[ self.inventory.size ] = self.lost_mule_guns[ i ];
  2626. self giveWeapon( self.lost_mule_guns[ i ] );
  2627. self SetWeaponAmmoClip( self.lost_mule_guns[ i ], self.muleAmmo[ self.lost_mule_guns[ i ] ][ "clip" ] );
  2628. if ( WeaponType( self.lost_mule_guns[ i ] ) != "grenade" )
  2629. self SetWeaponAmmoStock( self.lost_mule_guns[ i ], self.muleAmmo[ self.lost_mule_guns[ i ] ][ "stock" ] );
  2630.  
  2631. }
  2632. if ( current_weapon != self.mule_kick_switch_back )
  2633. self switchToWeapon( self.mule_kick_switch_back );
  2634.  
  2635. self.muleAmmo = undefined;
  2636. self.lost_mule_guns = undefined;
  2637. self.mule_kick_switch_back = undefined;
  2638. }
  2639.  
  2640. harrybo21_perks_mule_kick_weapon_change_watcher()
  2641. {
  2642. while( 1 )
  2643. {
  2644. self waittill( "weapon_change" );
  2645. if ( !self hasPerk( "specialty_extraammo" ) )
  2646. continue;
  2647.  
  2648. wait .1;
  2649. current_weapon = self getCurrentWeapon();
  2650. if ( self harrybo21_get_weapon_index( current_weapon ) > 1 )
  2651. self harrybo21_perks_mule_kick_hud_effect();
  2652.  
  2653. }
  2654. }
  2655.  
  2656. harrybo21_perks_mule_kick_hud_effect()
  2657. {
  2658. perk_index = self harrybo21_perks_get_hud_index( "specialty_extraammo" );
  2659. if ( !isDefined( perk_index ) )
  2660. return;
  2661.  
  2662. self endon( "disconnect" );
  2663. self endon( "lost_specialty_extraammo" );
  2664. self endon( "death" );
  2665. self.mule_glow_hud = NewClientHudElem( self );
  2666. self.mule_glow_hud.foreground = true;
  2667. self.mule_glow_hud.sort = 1;
  2668. self.mule_glow_hud.hidewheninmenu = false;
  2669. self.mule_glow_hud.alignX = "left";
  2670. self.mule_glow_hud.alignY = "bottom";
  2671. self.mule_glow_hud.horzAlign = "left";
  2672. self.mule_glow_hud.vertAlign = "bottom";
  2673. self.mule_glow_hud.x = ( perk_index * 30 ) - 12;
  2674. self.mule_glow_hud.y = self.mule_glow_hud.y - 70 + 12;
  2675. self.mule_glow_hud SetShader( "vending_vulture_glow_shader" , 48, 48 );
  2676. self.mule_glow_hud.alpha = 0;
  2677.  
  2678. self.mule_glow_hud harry_blink_hud( .5 );
  2679. }
  2680.  
  2681. harrybo21_perks_mule_kick_hud( gun_name )
  2682. {
  2683. self endon( "disconnect" );
  2684. if ( !level.zombie_vars[ "use_mule_kick_hud" ] )
  2685. return;
  2686.  
  2687. self thread harrybo21_perks_mule_kick_hud_effect();
  2688. }
  2689.  
  2690. // Electric Cherry Functionality ( "specialty_boost" ) ==============================================================================================
  2691.  
  2692. harrybo21_perks_electric_cherry( give )
  2693. {
  2694. self endon( "disconnect" );
  2695. if ( give )
  2696. {
  2697. self.consecutive_electric_cherry_attacks = 0;
  2698. self thread harrybo21_perks_cherry_perk_watcher();
  2699. }
  2700. else
  2701. {
  2702. self notify( "cherry_lost" );
  2703. self thread harrybo21_perks_cherry_laststand();
  2704. self notify( "lost_specialty_boost" );
  2705. // self harrybo21_perks_hud_remove( "specialty_boost" );
  2706. // iPrintLnBold( "lost cherry" );
  2707. }
  2708. }
  2709.  
  2710. harrybo21_perks_cherry_perk_watcher()
  2711. {
  2712. self endon( "disconnect" );
  2713. self endon( "cherry_lost" );
  2714. while( 1 )
  2715. {
  2716. self waittill( "reload_start" );
  2717. if ( self getCurrentWeapon() == "zombie_shield" )
  2718. continue;
  2719.  
  2720. self thread harrybo21_perks_run_cherry_reload();
  2721. self playSound( "cherry_alert" );
  2722. weapon = self GetCurrentWeapon();
  2723. clip = self GetCurrentWeaponClipAmmo();
  2724. while( 1 )
  2725. {
  2726. if( weapon != self GetCurrentWeapon() || clip != self GetCurrentWeaponClipAmmo() )
  2727. {
  2728. self notify( "reload_complete" );
  2729. break;
  2730. }
  2731. wait .1;
  2732. }
  2733. }
  2734. }
  2735.  
  2736. harrybo21_perks_cherry_laststand()
  2737. {
  2738. self endon( "disconnect" );
  2739. self endon( "cherry_down_over" );
  2740.  
  2741. fx = spawn( "script_model", self.origin + ( 0, 0, 5 ) );
  2742. fx setmodel( "tag_origin" );
  2743. fx thread harrybo21_perks_play_cherry_fx( 1, self );
  2744. fx playsound( "cherry_reload_charge" );
  2745.  
  2746. wait .05;
  2747.  
  2748. ai = GetAiSpeciesArray( "axis", "all" );
  2749. ai = get_array_of_closest( self.origin, ai, undefined, undefined, 500 );
  2750. for( i = 0; i < ai.size; i++ )
  2751. {
  2752. if ( distance( self.origin, ai[ i ].origin ) > level.zombie_vars[ "electric_cherry_max_range" ] )
  2753. continue;
  2754.  
  2755. if( ( isdefined( ai[ i ].boss ) && ai[ i ].boss ) || ( isDefined( ai[ i ].boss_mech ) && ai[ i ].boss_mech ) || ( isDefined( ai[ i ].animname ) && ( ai[ i ].animname == "boss_zombie" || ai[ i ].animname == "sonic_zombie" || ai[ i ].animname == "napalm_zombie" ) ) )
  2756. {
  2757. ai[ i ] doDamage( level.zombie_vars[ "electric_cherry_boss_damage" ], self.origin, self );
  2758. continue;
  2759. }
  2760.  
  2761. if ( ai[ i ].health <= level.zombie_vars[ "electric_cherry_max_damage" ] )
  2762. {
  2763. if( ai[ i ].has_legs )
  2764. ai[ i ].deathanim = random( level._zombie_tesla_death[ ai[ i ].animname ] );
  2765. else
  2766. ai[ i ].deathanim = random( level._zombie_tesla_crawl_death[ ai[ i ].animname ] );
  2767.  
  2768. self.score += level.zombie_vars[ "electric_cherry_points" ];
  2769. self maps\_zombiemode_score::set_player_score_hud();
  2770.  
  2771. ai[ i ] harrybo21_perks_cherry_death_fx();
  2772. }
  2773. else
  2774. {
  2775. ai[ i ] thread harrybo21_perks_cherry_stunned();
  2776. }
  2777. ai[ i ] DoDamage( level.zombie_vars[ "electric_cherry_max_damage" ] , ai[ i ].origin );
  2778. }
  2779. self notify( "cherry_down_over" );
  2780. }
  2781.  
  2782. harrybo21_perks_run_cherry_reload()
  2783. {
  2784. self endon( "disconnect" );
  2785.  
  2786. current_weapon = self GetCurrentWeapon();
  2787. clip = WeaponClipSize( current_weapon );
  2788. remaining = self GetCurrentWeaponClipAmmo();
  2789.  
  2790. if( clip <= 0 )
  2791. return;
  2792.  
  2793. switch( self.consecutive_electric_cherry_attacks )
  2794. {
  2795. case 2:
  2796. {
  2797. n_zombie_limit = 8;
  2798. break;
  2799. }
  2800. case 3:
  2801. {
  2802. n_zombie_limit = 4;
  2803. break;
  2804. }
  2805. case 4:
  2806. {
  2807. n_zombie_limit = 2;
  2808. break;
  2809. }
  2810. default:
  2811. {
  2812. n_zombie_limit = undefined;
  2813. break;
  2814. }
  2815. }
  2816.  
  2817. fraction = remaining / clip;
  2818.  
  2819. stock_ammo = self GetWeaponAmmoStock( current_weapon );
  2820.  
  2821. if ( stock_ammo < clip )
  2822. fraction = stock_ammo / clip;
  2823.  
  2824. range = level.zombie_vars[ "electric_cherry_max_range" ] * ( 1 - fraction );
  2825. perk_dmg = level.zombie_vars[ "electric_cherry_max_damage" ] * ( 1 - fraction );
  2826.  
  2827. if ( range < 64 )
  2828. range = 64;
  2829.  
  2830. fx = spawn( "script_model", self.origin + ( 0, 0, 5 ) );
  2831. fx setmodel( "tag_origin" );
  2832. // fx thread harrybo21_perks_follow_angles( self );
  2833. fx linkTo( self, "tag_origin", ( 0, 0, 0 ), ( 270, 0, 0 ) );
  2834. fx thread harrybo21_perks_play_cherry_fx( ( 1 - fraction ), self );
  2835. fx playsound( "cherry_reload_charge" );
  2836.  
  2837. ai = GetAiSpeciesArray( "axis", "all" );
  2838. ai = get_array_of_closest( self.origin, ai );
  2839. n_zombies_hit = 0;
  2840. for( i = 0; i < ai.size; i++ )
  2841. {
  2842. if ( distance( self.origin, ai[ i ].origin ) > range )
  2843. continue;
  2844. if ( isDefined( n_zombie_limit ) && n_zombies_hit > n_zombie_limit )
  2845. break;
  2846. if( ( isdefined( ai[ i ].boss ) && ai[ i ].boss ) || ( isDefined( ai[ i ].boss_mech ) && ai[ i ].boss_mech ) || ( isDefined( ai[ i ].animname ) && ( ai[ i ].animname == "boss_zombie" || ai[ i ].animname == "sonic_zombie" || ai[ i ].animname == "napalm_zombie" ) ) )
  2847. {
  2848. ai[ i ] doDamage( level.zombie_vars[ "electric_cherry_boss_damage" ] * ( 1 - fraction ), self.origin, self );
  2849. continue;
  2850. }
  2851. if ( isDefined( level.zombie_vars["zombie_powerup_insta_kill_on"] ) && level.zombie_vars["zombie_powerup_insta_kill_on"] )
  2852. perk_dmg = ai[ i ].health + 666;
  2853.  
  2854. if ( ai[ i ].health <= perk_dmg )
  2855. {
  2856. if( ai[ i ].has_legs )
  2857. ai[ i ].deathanim = random( level._zombie_tesla_death[ ai[ i ].animname ] );
  2858. else
  2859. ai[ i ].deathanim = random( level._zombie_tesla_crawl_death[ ai[ i ].animname ] );
  2860.  
  2861. score = level.zombie_vars[ "electric_cherry_points" ];
  2862. if ( level.zombie_vars["zombie_powerup_point_doubler_on"] )
  2863. score = score * 2;
  2864.  
  2865. self.score += score;
  2866. self maps\_zombiemode_score::set_player_score_hud();
  2867.  
  2868. ai[ i ] harrybo21_perks_cherry_death_fx();
  2869. }
  2870. else
  2871. {
  2872. ai[ i ] thread harrybo21_perks_cherry_stunned();
  2873. }
  2874. n_zombies_hit++;
  2875. ai[ i ] DoDamage( perk_dmg , ai[ i ].origin );
  2876. }
  2877. self thread harrybo21_perks_cherry_cooldown_timer( self getCurrentWeapon() );
  2878. }
  2879.  
  2880. harrybo21_perks_play_cherry_fx( fraction, player )
  2881. {
  2882. self endon( "disconnect" );
  2883.  
  2884. self endon( "cherry_player_fx_over" );
  2885. if ( fraction >= 0.67 )
  2886. shock_fx = "cherry_shock_3";
  2887. else if ( fraction >= 0.33 && fraction < 0.67 )
  2888. shock_fx = "cherry_shock_2";
  2889. else
  2890. shock_fx = "cherry_shock_1";
  2891.  
  2892. PlayFxOnTag( level._effect[ shock_fx ], self, "tag_origin" );
  2893. wait 2;
  2894. self delete();
  2895. self notify( "cherry_player_fx_over" );
  2896. }
  2897.  
  2898. harrybo21_perks_cherry_stunned()
  2899. {
  2900. self thread harrybo21_perks_cherry_shock_fx();
  2901. if ( !self enemy_is_dog() )
  2902. self.cherry_stunned = true;
  2903.  
  2904. }
  2905.  
  2906. harrybo21_perks_cherry_cooldown_timer( str_current_weapon )
  2907. {
  2908. self notify( "electric_cherry_cooldown_started" );
  2909. self endon( "electric_cherry_cooldown_started" );
  2910. self endon( "cherry_lost" );
  2911. self endon( "death" );
  2912. self endon( "disconnect" );
  2913. self waittill( "reload_complete" );
  2914. n_cooldown_time = 3;
  2915. wait n_cooldown_time;
  2916. self.consecutive_electric_cherry_attacks = 0;
  2917. }
  2918.  
  2919. harrybo21_perks_cherry_shock_fx()
  2920. {
  2921. self endon( "death" );
  2922. tag = "J_SpineUpper";
  2923. fx = "tesla_shock_secondary";
  2924. if ( self enemy_is_dog() )
  2925. {
  2926. tag = "J_Spine1";
  2927. }
  2928. self playSound( "imp_tesla" );
  2929. PlayFxOnTag( level._effect[ fx ], self, tag );
  2930. }
  2931.  
  2932. harrybo21_perks_cherry_death_fx()
  2933. {
  2934. self endon( "death" );
  2935. tag = "J_SpineUpper";
  2936. fx = "tesla_shock";
  2937. if ( self enemy_is_dog() )
  2938. {
  2939. tag = "J_Spine1";
  2940. }
  2941. PlayFxOnTag( level._effect[ fx ], self, tag );
  2942. self playsound( "imp_tesla" );
  2943.  
  2944. if ( !self enemy_is_dog() )
  2945. {
  2946. PlayFxOnTag( level._effect[ "tesla_shock_eyes" ], self, "J_Eyeball_LE" );
  2947. }
  2948. }
  2949.  
  2950. // Tombstone Functionality ( "specialty_reconnaissance" ) ==============================================================================================
  2951.  
  2952. harrybo21_perks_tombstone( give )
  2953. {
  2954. self endon( "disconnect" );
  2955. if ( isDefined( give ) && give )
  2956. {
  2957. // self thread harrybo21_perks_tombstone_watcher();
  2958. }
  2959. // NO LOSE FUNCTION FOR A REASON
  2960. }
  2961.  
  2962. harrybo21_perks_tombstone_spawn( owner )
  2963. {
  2964. tombstone = spawn( "script_model" , self.origin + ( 0, 0, 35 ) );
  2965. tombstone setModel( "bo2_ch_tombstone1" );
  2966. tombstone thread harrybo21_wobble_object();
  2967. tombstone.tombstone_stuff = self.loadout;
  2968. playfxontag ( level._effect[ "powerup_on" ], tombstone, "tag_origin" );
  2969. tombstone thread harrybo21_perks_tombstone_thread( owner );
  2970. tombstone thread harrybo21_perks_tombstone_timeout( owner );
  2971. return tombstone;
  2972. }
  2973.  
  2974. harrybo21_perks_tombstone_activate()
  2975. {
  2976. tombstone = harrybo21_perks_tombstone_spawn( self );
  2977. self harrybo21_perks_remove_all();
  2978. players = get_players();
  2979. if ( !is_coop() )
  2980. {
  2981. spawn_point = harrybo21_get_respawn_not_in_sight_of_object( self );
  2982. self linkTo( spawn_point );
  2983. self setorigin( spawn_point.origin );
  2984. self setplayerangles( spawn_point.angles );
  2985. playsoundatposition( "evt_ww_appear", spawn_point.origin );
  2986.  
  2987. self takeAllWeapons();
  2988. self.inventory = [];
  2989. self.inventory[ 0 ] = level.zombie_vars[ "start_pistol" ];
  2990. self.inventory[ 1 ] = level.zombie_vars[ "none" ];
  2991. self giveWeapon( level.zombie_vars[ "start_pistol" ] );
  2992. self SwitchToWeapon( level.zombie_vars[ "start_pistol" ] );
  2993. self.inventory = [];
  2994. self.inventory[ 0 ] = level.zombie_vars[ "start_pistol" ];
  2995. self.inventory[ 1 ] = "none";
  2996. self.revived = true;
  2997.  
  2998. self harrybo21_perks_player_fake_revive();
  2999. self unlink();
  3000. self stopLoopSound();
  3001. self VisionSetNaked( level.zombie_vars[ "vision_file" ], 1 );
  3002. setClientSysState( "lsm", "0", self );
  3003. }
  3004. else
  3005. {
  3006. self thread harrybo21_perks_tombstone_suicide();
  3007. }
  3008. self.tombstone_last_stand = undefined;
  3009. }
  3010.  
  3011. harrybo21_perks_tombstone_cleanup()
  3012. {
  3013. self waittill_any( "disconnect", "player_died", "player_revived", "tombstone_grabbed" );
  3014.  
  3015. self.tombstoneProgressBar destroy();
  3016. self.tombstoneProgressBar delete();
  3017. self.tombstoneProgressBar = undefined;
  3018. self.tombstone_hud destroy();
  3019. self.tombstone_hud delete();
  3020. self.tombstone_hud = undefined;
  3021. }
  3022.  
  3023. harrybo21_perks_tombstone_suicide()
  3024. {
  3025. self endon( "death" );
  3026. self endon( "disconnect" );
  3027. self endon( "zombified" );
  3028. self endon( "player_revived" );
  3029. self endon( "tombstone_grabbed" );
  3030. self.tombstone_hud = newclienthudelem( self );
  3031. self.tombstone_hud.horzAlign = "center";
  3032. self.tombstone_hud.vertAlign = "middle";
  3033. self.tombstone_hud.alignX = "center";
  3034. self.tombstone_hud.alignY = "middle";
  3035. self.tombstone_hud.y += 70;
  3036. self.tombstone_hud.foreground = 1;
  3037. self.tombstone_hud.fontscale = 1.2;
  3038. self.tombstone_hud.alpha = 1;
  3039. self thread harrybo21_perks_tombstone_cleanup();
  3040. while( 1 )
  3041. {
  3042. self.tombstone_hud SetText( "Press ^6[{+activate}]^7 [Please don't feed the zombies]" );
  3043.  
  3044. time = 0;
  3045. self.tombstoneProgressBar = self createPrimaryProgressBar();
  3046. while( self UseButtonPressed() && time < 1 )
  3047. {
  3048. self.tombstoneProgressBar updateBar( 1 - time );
  3049. self.tombstone_hud SetText( "Don't feed the zombies" );
  3050. time += .1;
  3051. wait .1;
  3052. }
  3053.  
  3054. self.tombstoneProgressBar destroyElem();
  3055. if ( time >= 1 )
  3056. {
  3057. while( isDefined( self.revivetrigger ) && self.revivetrigger.beingRevived )
  3058. wait .1;
  3059.  
  3060. self VisionSetNaked( level.zombie_vars[ "vision_file" ], 0 );
  3061. setClientSysState("lsm", "0", self); // Notify client last stand ended.
  3062. self notify( "end_bleedout" );
  3063. self [[ level.player_becomes_zombie ]]();
  3064. break;
  3065. }
  3066.  
  3067. wait .1;
  3068. }
  3069. }
  3070.  
  3071. harrybo21_perks_tombstone_thread( player )
  3072. {
  3073. self endon( "delete" );
  3074. self endon( "tombstone_timedout" );
  3075. while( 1 )
  3076. {
  3077. if ( distance( player.origin, self.origin ) < 64 && !player maps\_laststand::player_is_in_laststand() && player.sessionstate != "spectator" )
  3078. break;
  3079.  
  3080. wait .01;
  3081. }
  3082. playfx( level._effect[ "powerup_grabbed" ], self.origin );
  3083. playsoundatposition( "powerup_grabbed", self.origin );
  3084. self stoploopsound( 1 );
  3085.  
  3086. discard_perks = [];
  3087. if ( !is_coop() )
  3088. discard_perks[ discard_perks.size ] = "specialty_quickrevive";
  3089.  
  3090. discard_perks[ discard_perks.size ] = "specialty_shades";
  3091. discard_perks[ discard_perks.size ] = "specialty_reconnaissance";
  3092.  
  3093. player harrybo21_return_loadout( self.tombstone_stuff, discard_perks );
  3094. player notify( "tombstone_grabbed" );
  3095. self delete();
  3096. }
  3097.  
  3098. harrybo21_perks_tombstone_timeout( player )
  3099. {
  3100. player endon( "disconnect" );
  3101. self endon( "tombstone_grabbed" );
  3102. self endon( "tombstone_timedout" );
  3103. player waittill( "spawned_player" );
  3104. player waittill_any( "fake_death", "death", "player_downed", "specialty_reconnaissance_drank" );
  3105. self delete();
  3106. self notify( "tombstone_timedout" );
  3107. }
  3108.  
  3109. // Whos Who Functionality ( "specialty_shades" ) ==============================================================================================
  3110.  
  3111. harrybo21_perks_whos_who( give )
  3112. {
  3113. self endon( "disconnect" );
  3114. if ( give )
  3115. {
  3116. self notify( "perk_chugabud_activated" );
  3117. }
  3118. else
  3119. {
  3120. self notify( "whos_who_over" );
  3121. }
  3122. }
  3123.  
  3124. harrybo21_perks_whos_who_laststand_check()
  3125. {
  3126. if ( isDefined( self.whos_who_active ) && self.whos_who_active )
  3127. return true;
  3128. else
  3129. return false;
  3130.  
  3131. }
  3132.  
  3133. harrybo21_perks_whos_who_laststand()
  3134. {
  3135. self endon( "player_suicide" );
  3136. self endon( "disconnect" );
  3137. self notify ("end_bleedout");
  3138. origin = self.origin;
  3139.  
  3140. players = get_players();
  3141.  
  3142. self.whos_who_active = true;
  3143. self freezecontrols( true );
  3144.  
  3145. self takeAllWeapons();
  3146. self giveWeapon( "zombie_downed" );
  3147. self SwitchToWeapon( "zombie_downed" );
  3148. self waittill( "weapon_change_complete" );
  3149.  
  3150. auto_revive = false;
  3151. if ( !is_coop() && self hasPerk( "specialty_quickrevive" ) )
  3152. auto_revive = true;
  3153.  
  3154. self harrybo21_perks_remove_all();
  3155. self giveWeapon( level.zombie_vars[ "start_pistol" ] );
  3156. self SwitchToWeapon( level.zombie_vars[ "start_pistol" ] );
  3157. self takeWeapon( "zombie_downed" );
  3158.  
  3159. self.inventory = [];
  3160. self.inventory[ 0 ] = level.zombie_vars[ "start_pistol" ];
  3161. self.inventory[ 1 ] = "none";
  3162. self harrybo21_perks_whos_who_fake_revive();
  3163.  
  3164. corpse = self harrybo21_perks_whos_who_spawn_corpse( origin );
  3165. corpse thread harrybo21_perks_whos_who_corpse_revive_icon( self, corpse );
  3166. corpse thread harrybo21_perks_whos_who_corpse_cleanup_on_spectator( self );
  3167. self thread harrybo21_perks_whos_who_handle_multiple_instances( corpse );
  3168.  
  3169. // self VisionSetNaked( "zombie_whos_who", 1 );
  3170. self VisionSetNaked( "r_poisonFX_debug_enable", 1 );
  3171. self setClientDvar( "r_poisonFX_debug_enable", 1 );
  3172. self setClientDvar( "r_poisonFX_pulse", 2 );
  3173. self setClientDvar( "r_poisonFX_warpy", 0.3 );
  3174.  
  3175. self thread harrybo21_perks_whos_who_bleed_timeout( level.zombie_vars[ "whos_who_bleedout_time" ], corpse );
  3176.  
  3177. corpse waittill( "player_revived", e_reviver );
  3178. self setClientDvar( "r_poisonFX_debug_enable", 0 );
  3179.  
  3180. if ( auto_revive )
  3181. e_reviver = self;
  3182.  
  3183. if ( self maps\_laststand::player_is_in_laststand() )
  3184. {
  3185. self thread harrybo21_perks_whos_who_laststand_cleanup( corpse, "player_revived" );
  3186. self enableweaponcycling();
  3187. self _enableoffhandweapons();
  3188. return;
  3189. }
  3190. self harrybo21_perks_whos_who_laststand_cleanup( corpse, e_reviver );
  3191. wait 1;
  3192. }
  3193.  
  3194. harrybo21_perks_whos_who_handle_multiple_instances( corpse )
  3195. {
  3196. corpse endon( "death" );
  3197. self waittill( "perk_chugabud_activated" );
  3198. self harrybo21_perks_whos_who_corpse_cleanup( corpse, 0 );
  3199. }
  3200.  
  3201. harrybo21_perks_whos_who_laststand_cleanup( corpse, str_notify )
  3202. {
  3203. if ( isDefined( str_notify ) )
  3204. self waittill( str_notify );
  3205.  
  3206. self harrybo21_perks_whos_who_corpse_cleanup( corpse, str_notify );
  3207.  
  3208. }
  3209.  
  3210. harrybo21_perks_whos_who_revive_check()
  3211. {
  3212. if ( isDefined( self.loadout.perk_inventory ) && self.loadout.perk_inventory.size > 0 )
  3213. {
  3214. for ( i = 0; i < self.loadout.perk_inventory.size; i++ )
  3215. {
  3216. if ( self.loadout.perk_inventory[ i ] == "specialty_quickrevive" )
  3217. return true;
  3218. }
  3219. }
  3220. return false;
  3221. }
  3222.  
  3223. harrybo21_perks_whos_who_bleed_timeout( delay, corpse )
  3224. {
  3225. self endon( "player_suicide" );
  3226. self endon( "disconnect" );
  3227. corpse endon( "death" );
  3228. wait delay;
  3229. while ( isDefined( corpse.revivetrigger ) )
  3230. {
  3231. if ( corpse.revivetrigger.beingrevived )
  3232. {
  3233. wait .01;
  3234. continue;
  3235. }
  3236. break;
  3237. }
  3238. corpse notify( "player_revived" );
  3239. }
  3240.  
  3241. harrybo21_perks_whos_who_corpse_cleanup( corpse, was_revived )
  3242. {
  3243. self notify( "chugabud_effects_cleanup" );
  3244. self stopLoopSound( 1 );
  3245. if ( isDefined( was_revived ) && was_revived )
  3246. {
  3247. discard_perks = [];
  3248. // if ( !is_coop() )
  3249. // discard_perks[ discard_perks.size ] = "specialty_quickrevive";
  3250.  
  3251. discard_perks[ discard_perks.size ] = "specialty_shades";
  3252. self harrybo21_perks_remove_all();
  3253. self setorigin( corpse.origin );
  3254. self setplayerangles( corpse.angles );
  3255. wait .1;
  3256. self VisionSetNaked( level.zombie_vars[ "vision_file" ], 1 );
  3257. self harrybo21_return_loadout( corpse.loadout, discard_perks );
  3258. playsoundatposition( "evt_ww_appear", corpse.origin );
  3259. playfx( level._effect[ "whos_who_burst" ], corpse.origin );
  3260. }
  3261. else
  3262. {
  3263. playsoundatposition( "evt_ww_disappear", corpse.origin );
  3264. playfx( level._effect[ "whos_who_burst" ], corpse.origin );
  3265. self notify( "chugabud_bleedout" );
  3266. }
  3267. if ( isDefined( corpse.revivetrigger ) )
  3268. {
  3269. corpse notify( "stop_revive_trigger" );
  3270. corpse.revivetrigger delete();
  3271. corpse.revivetrigger = undefined;
  3272. }
  3273. if ( isDefined( corpse.revive_hud_elem ) )
  3274. {
  3275. corpse.revive_hud_elem destroy();
  3276. corpse.revive_hud_elem = undefined;
  3277. }
  3278. corpse delete();
  3279. if ( !self maps\_laststand::player_is_in_laststand() )
  3280. {
  3281. setClientSysState( "lsm", "0", self );
  3282. self stopLoopSound();
  3283. self VisionSetNaked( level.zombie_vars[ "vision_file" ] );
  3284. }
  3285. self.e_chugabud_corpse = undefined;
  3286. self.whos_who_active = undefined;
  3287. }
  3288.  
  3289. harrybo21_perks_whos_who_fake_revive()
  3290. {
  3291. playsoundatposition( "evt_ww_disappear", self.origin );
  3292.  
  3293. spawn_point = harrybo21_get_respawn_not_in_sight_of_object( self );
  3294.  
  3295. self linkTo( spawn_point );
  3296. self setorigin( spawn_point.origin );
  3297. self setplayerangles( spawn_point.angles );
  3298. playsoundatposition( "evt_ww_appear", spawn_point.origin );
  3299. playfx( level._effect[ "whos_who_burst" ], spawn_point.origin );
  3300. self unlink();
  3301. self harrybo21_perks_player_fake_revive();
  3302. self playloopSound( "evt_ww_loop", 1 );
  3303. }
  3304.  
  3305. harrybo21_perks_whos_who_spawn_corpse( origin )
  3306. {
  3307. corpse = harrybo21_perks_whos_who_spawn_player_clone( self, origin, undefined, self.whos_who_shader );
  3308. corpse UseAnimTree( #animtree );
  3309. corpse.angles = self.angles;
  3310. corpse setAnim( %pb_laststand_idle );
  3311. corpse.revive_hud = self harrybo21_perks_whos_who_revive_hud_create();
  3312. corpse maps\_laststand::revive_trigger_spawn();
  3313. corpse.loadout = self.loadout;
  3314. self.e_chugabud_corpse = corpse;
  3315.  
  3316. return corpse;
  3317. }
  3318.  
  3319. harrybo21_perks_whos_who_corpse_cleanup_on_spectator( player )
  3320. {
  3321. self endon( "death" );
  3322. player endon( "disconnect" );
  3323. while ( 1 )
  3324. {
  3325. if ( player.sessionstate == "spectator" )
  3326. {
  3327. break;
  3328. }
  3329. else
  3330. {
  3331. wait 0.01;
  3332. }
  3333. }
  3334. setClientSysState( "lsm", "0", player ); // Notify client last stand ended.
  3335. player stopLoopSound();
  3336. player VisionSetNaked( level.zombie_vars[ "vision_file" ] );
  3337. player harrybo21_perks_whos_who_corpse_cleanup( self, 0 );
  3338. }
  3339.  
  3340. harrybo21_perks_whos_who_revive_colour_change_thread( player, corpse )
  3341. {
  3342. player endon( "death" );
  3343. self endon( "delete" );
  3344. player endon( "chugabud_bleedout" );
  3345. self endon( "colour_change_complete" );
  3346. bleed_out_time = GetDvarFloat( "player_lastStandBleedoutTime" );
  3347. remaining_bleed_out_time = GetDvarFloat( "player_lastStandBleedoutTime" );
  3348.  
  3349. while( 1 )
  3350. {
  3351. fraction = remaining_bleed_out_time / bleed_out_time;
  3352.  
  3353. self.color = ( 1, fraction, 0 );
  3354. if ( isDefined( corpse.revivetrigger.beingRevived ) && corpse.revivetrigger.beingRevived )
  3355. self.color = ( 1, 1, 1 );
  3356.  
  3357. remaining_bleed_out_time -= .1;
  3358. wait .1;
  3359. }
  3360. self notify( "colour_change_complete" );
  3361. }
  3362.  
  3363. harrybo21_perks_whos_who_corpse_revive_icon( player, corpse )
  3364. {
  3365. self endon( "death" );
  3366. height_offset = 30;
  3367. hud_elem = newHudElem();
  3368. self.revive_hud_elem = hud_elem;
  3369. hud_elem.x = self.origin[ 0 ];
  3370. hud_elem.y = self.origin[ 1 ];
  3371. hud_elem.z = self.origin[ 2 ] + height_offset;
  3372. hud_elem.color = ( 1, 1, 0 );
  3373. hud_elem setWaypoint( false, "bo2_waypoint_revive" );
  3374. hud_elem.hidewheninmenu = 1;
  3375. hud_elem.immunetodemogamehudsettings = 1;
  3376. hud_elem thread harrybo21_perks_whos_who_revive_colour_change_thread( player, corpse );
  3377. }
  3378.  
  3379. harrybo21_perks_whos_who_revive_hud_create()
  3380. {
  3381. self.revive_hud = newclienthudelem( self );
  3382. self.revive_hud.alignx = "center";
  3383. self.revive_hud.aligny = "middle";
  3384. self.revive_hud.horzalign = "center";
  3385. self.revive_hud.vertalign = "bottom";
  3386. self.revive_hud.y = -50;
  3387. self.revive_hud.foreground = 1;
  3388. self.revive_hud.font = "default";
  3389. self.revive_hud.fontscale = 1.5;
  3390. self.revive_hud.alpha = 0;
  3391. self.revive_hud.color = ( 1, 1, 1 );
  3392. self.revive_hud settext( "" );
  3393. return self.revive_hud;
  3394. }
  3395.  
  3396. harrybo21_perks_whos_who_spawn_player_clone( player, origin, forceweapon, forcemodel )
  3397. {
  3398. if ( !isDefined( origin ) )
  3399. {
  3400. origin = player.origin;
  3401. }
  3402. primaryweapons = player getweaponslistprimaries();
  3403. if ( isDefined( forceweapon ) )
  3404. {
  3405. weapon = forceweapon;
  3406. }
  3407. else if ( primaryweapons.size )
  3408. {
  3409. weapon = primaryweapons[ 0 ];
  3410. }
  3411. else
  3412. {
  3413. weapon = player getcurrentweapon();
  3414. }
  3415. weaponmodel = getweaponmodel( weapon );
  3416. clone = spawn( "script_model", origin );
  3417. clone.isactor = 0;
  3418. if ( isDefined( forcemodel ) )
  3419. {
  3420. clone setmodel( forcemodel );
  3421. }
  3422. else
  3423. {
  3424. clone setmodel( self.model );
  3425. if ( isDefined( player.headmodel ) )
  3426. {
  3427. clone.headmodel = player.headmodel;
  3428. clone attach( clone.headmodel, "", 1 );
  3429. }
  3430. }
  3431. if ( weaponmodel != "" && weaponmodel != "none" )
  3432. {
  3433. clone attach( weaponmodel, "tag_weapon_right" );
  3434. }
  3435. clone.team = player.team;
  3436. clone.is_inert = 1;
  3437. clone.zombie_move_speed = "walk";
  3438. clone.script_noteworthy = "corpse_clone";
  3439. return clone;
  3440. }
  3441.  
  3442. // Vulture Functionality ( "specialty_ordinance" ) ==============================================================================================
  3443.  
  3444. harrybo21_perks_player_has_vulture()
  3445. {
  3446. players = get_players();
  3447. for( i = 0; i < players.size; i++ )
  3448. {
  3449. if( players[ i ] hasPerk( "specialty_ordinance" ) )
  3450. return true;
  3451.  
  3452. }
  3453. return false;
  3454. }
  3455.  
  3456. harrybo21_vulture_chest_watcher()
  3457. {
  3458. while( 1 )
  3459. {
  3460. level waittill( "weapon_fly_away_end" );
  3461. players = get_players();
  3462. for ( i = 0; i < players.size; i++ )
  3463. {
  3464. trigger = level.chests[ level.chest_index ];
  3465. lid = getEnt( trigger.target, "targetname" );
  3466.  
  3467. structs = getStructArray( lid.targetname, "target" );
  3468. if ( !isDefined( structs ) || structs.size < 1 )
  3469. continue;
  3470.  
  3471. for ( s = 0; s < structs.size; s++ )
  3472. {
  3473. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" )
  3474. {
  3475. SetClientSysState( "zombiemode_perks", "destroy_fx," + structs[ s ].targetname, players[ i ] );
  3476. }
  3477. }
  3478. // if ( players[ i ] hasPerk( "specialty_ordinance" )
  3479.  
  3480. }
  3481. level waittill( "magic_box_light_switch" );
  3482. for ( i = 0; i < players.size; i++ )
  3483. {
  3484. trigger = level.chests[ level.chest_index ];
  3485. lid = getEnt( trigger.target, "targetname" );
  3486.  
  3487. structs = getStructArray( lid.targetname, "target" );
  3488. if ( !isDefined( structs ) || structs.size < 1 )
  3489. continue;
  3490. // trigger = level.chests[ level.chest_index ];
  3491. // lid = getEnt( trigger.target, "targetname" );
  3492. for ( s = 0; s < structs.size; s++ )
  3493. {
  3494. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" && players[ i ] hasPerk( "specialty_ordinance" ) )
  3495. {
  3496. SetClientSysState( "zombiemode_perks", "destroy_fx," + structs[ s ].targetname, players[ i ] );
  3497. wait_network_frame();
  3498. SetClientSysState( "zombiemode_perks", "spawn_fx," + structs[ s ].targetname, players[ i ] );
  3499. wait_network_frame();
  3500. SetClientSysState( "zombiemode_perks", "play_fx," + structs[ s ].targetname, players[ i ] );
  3501. }
  3502. else
  3503. SetClientSysState( "zombiemode_perks", "destroy_fx," + structs[ s ].targetname, players[ i ] );
  3504.  
  3505. }
  3506.  
  3507. }
  3508. }
  3509. }
  3510.  
  3511. harrybo21_vulture_hud_manage_fx( type )
  3512. {
  3513. players = get_players();
  3514. if ( !isDefined( type ) )
  3515. type = true;
  3516.  
  3517. structs = getStructArray( self.targetname, "target" );
  3518. if ( !isDefined( structs ) || structs.size < 1 )
  3519. return;
  3520.  
  3521. for ( s = 0; s < structs.size; s++ )
  3522. {
  3523. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" )
  3524. {
  3525. for ( p = 0; p < players.size; p++ )
  3526. {
  3527. if ( type && players[ p ] hasPerk( "specialty_ordinance" ) )
  3528. {
  3529. SetClientSysState( "zombiemode_perks", "destroy_fx," + structs[ s ].targetname, players[ p ] );
  3530. wait_network_frame();
  3531. SetClientSysState( "zombiemode_perks", "spawn_fx," + structs[ s ].targetname, players[ p ] );
  3532. wait_network_frame();
  3533. SetClientSysState( "zombiemode_perks", "play_fx," + structs[ s ].targetname, players[ p ] );
  3534. }
  3535. else
  3536. SetClientSysState( "zombiemode_perks", "destroy_fx," + structs[ s ].targetname, players[ p ] );
  3537.  
  3538. }
  3539. }
  3540. }
  3541. }
  3542.  
  3543. harrybo21_vulture_change_hud_fx( new_fx )
  3544. {
  3545. players = get_players();
  3546. for ( p = 0; p < players.size; p++ )
  3547. SetClientSysState( "zombiemode_perks", "change_fx," + self.targetname + "," + new_fx, players[ p ] );
  3548. }
  3549.  
  3550. harrybo21_reveal_vulture_huds( type )
  3551. {
  3552. if ( !isDefined( type ) )
  3553. type = true;
  3554.  
  3555. machines = getEntArray( "harrybo21_vending", "script_noteworthy" );
  3556. if ( isDefined( machines ) && machines.size > 0 )
  3557. {
  3558. for ( i = 0; i < machines.size; i++ )
  3559. {
  3560. structs = getStructArray( machines[ i ].targetname, "target" );
  3561. if ( !isDefined( structs ) || structs.size < 1 )
  3562. continue;
  3563.  
  3564. for ( s = 0; s < structs.size; s++ )
  3565. {
  3566. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" )
  3567. {
  3568. if ( type && ( isDefined( machines[ i ].active ) && machines[ i ].active ) ) // && ( !isDefined( machines[ i ].is_swapping ) || ( isDefined( machines[ i ].is_swapping ) && !machines[ i ].is_swapping ) ) )
  3569. {
  3570. SetClientSysState( "zombiemode_perks", "spawn_fx," + structs[ s ].targetname, self );
  3571. SetClientSysState( "zombiemode_perks", "play_fx," + structs[ s ].targetname, self );
  3572. }
  3573. else
  3574. SetClientSysState( "zombiemode_perks", "destroy_fx," + structs[ s ].targetname, self );
  3575.  
  3576. }
  3577. }
  3578. }
  3579. }
  3580.  
  3581. harrybo21_mystery_box = getEntArray( "harrybo21_mystery_box", "script_noteworthy" );
  3582. if ( isDefined( harrybo21_mystery_box ) && harrybo21_mystery_box.size > 0 )
  3583. {
  3584. for ( i = 0; i < harrybo21_mystery_box.size; i++ )
  3585. {
  3586. ent = getEnt( harrybo21_mystery_box[ i ].target, "targetname" );
  3587. structs = getStructArray( ent.targetname, "target" );
  3588. if ( !isDefined( structs ) || structs.size < 1 )
  3589. continue;
  3590.  
  3591. for ( s = 0; s < structs.size; s++ )
  3592. {
  3593. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" )
  3594. {
  3595. if ( type && ( isDefined( harrybo21_mystery_box[ i ].active ) && harrybo21_mystery_box[ i ].active ) ) // && ( !isDefined( machines[ i ].is_swapping ) || ( isDefined( machines[ i ].is_swapping ) && !machines[ i ].is_swapping ) ) )
  3596. {
  3597. iPrintLnBold( "activate perks vulture hud" );
  3598. SetClientSysState( "zombiemode_perks", "spawn_fx," + structs[ s ].targetname, self );
  3599. SetClientSysState( "zombiemode_perks", "play_fx," + structs[ s ].targetname, self );
  3600. }
  3601. else
  3602. SetClientSysState( "zombiemode_perks", "destroy_fx," + structs[ s ].targetname, self );
  3603.  
  3604. }
  3605. }
  3606. }
  3607. }
  3608. mystery_box = level.chests;
  3609. if ( isDefined( mystery_box ) && mystery_box.size > 0 )
  3610. {
  3611. for ( i = 0; i < mystery_box.size; i++ )
  3612. {
  3613. lid = getEnt( mystery_box[ i ].target, "targetname" );
  3614. structs = getStructArray( lid.targetname, "target" );
  3615. if ( !isDefined( structs ) || structs.size < 1 )
  3616. continue;
  3617.  
  3618. for ( s = 0; s < structs.size; s++ )
  3619. {
  3620. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" )
  3621. {
  3622. if ( type )
  3623. {
  3624. if ( level.chest_index == i )
  3625. {
  3626. SetClientSysState( "zombiemode_perks", "spawn_fx," + structs[ s ].targetname, self );
  3627. SetClientSysState( "zombiemode_perks", "play_fx," + structs[ s ].targetname, self );
  3628. }
  3629. }
  3630. else
  3631. SetClientSysState( "zombiemode_perks", "destroy_fx," + structs[ s ].targetname, self );
  3632.  
  3633. }
  3634. }
  3635. }
  3636. }
  3637. harrybo21_upgrade = getEntArray( "harrybo21_upgrade", "script_noteworthy" );
  3638. if ( isDefined( harrybo21_upgrade ) && harrybo21_upgrade.size > 0 )
  3639. {
  3640. for ( i = 0; i < harrybo21_upgrade.size; i++ )
  3641. {
  3642. structs = getStructArray( harrybo21_upgrade[ i ].targetname, "target" );
  3643. if ( !isDefined( structs ) || structs.size < 1 )
  3644. continue;
  3645.  
  3646. for ( s = 0; s < structs.size; s++ )
  3647. {
  3648. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" )
  3649. {
  3650. if ( type && ( isDefined( harrybo21_upgrade[ i ].active ) && harrybo21_upgrade[ i ].active ) )
  3651. {
  3652. SetClientSysState( "zombiemode_perks", "spawn_fx," + structs[ s ].targetname, self );
  3653. SetClientSysState( "zombiemode_perks", "play_fx," + structs[ s ].targetname, self );
  3654. }
  3655. else
  3656. SetClientSysState( "zombiemode_perks", "destroy_fx," + structs[ s ].targetname, self );
  3657. }
  3658. }
  3659. }
  3660. }
  3661. harrybo21_vending_wonderfizz = getEntArray( "harrybo21_vending_wonderfizz", "script_noteworthy" );
  3662. if ( isDefined( harrybo21_vending_wonderfizz ) && harrybo21_vending_wonderfizz.size > 0 )
  3663. {
  3664. for ( i = 0; i < harrybo21_vending_wonderfizz.size; i++ )
  3665. {
  3666. structs = getStructArray( harrybo21_vending_wonderfizz[ i ].targetname, "target" );
  3667. if ( !isDefined( structs ) || structs.size < 1 )
  3668. continue;
  3669.  
  3670. for ( s = 0; s < structs.size; s++ )
  3671. {
  3672. if ( isDefined( structs[ s ].script_noteworthy ) && structs[ s ].script_noteworthy == "vulture_hud" )
  3673. {
  3674. if ( type && ( isDefined( harrybo21_vending_wonderfizz[ i ].active ) && harrybo21_vending_wonderfizz[ i ].active ) )
  3675. {
  3676. SetClientSysState( "zombiemode_perks", "spawn_fx," + structs[ s ].targetname, self );
  3677. SetClientSysState( "zombiemode_perks", "play_fx," + structs[ s ].targetname, self );
  3678. }
  3679. else
  3680. SetClientSysState( "zombiemode_perks", "destroy_fx," + structs[ s ].targetname, self );
  3681.  
  3682. }
  3683. }
  3684. }
  3685. }
  3686. harrybo21_wallbuys = getStructArray( "vulture_hud_weapon", "script_noteworthy" );
  3687. if ( !isDefined( harrybo21_wallbuys ) || harrybo21_wallbuys.size < 1 )
  3688. return;
  3689.  
  3690. for ( s = 0; s < harrybo21_wallbuys.size; s++ )
  3691. {
  3692. if ( type )
  3693. {
  3694. SetClientSysState( "zombiemode_perks", "spawn_fx," + harrybo21_wallbuys[ s ].targetname, self );
  3695. SetClientSysState( "zombiemode_perks", "play_fx," + harrybo21_wallbuys[ s ].targetname, self );
  3696. }
  3697. else
  3698. SetClientSysState( "zombiemode_perks", "destroy_fx," + harrybo21_wallbuys[ s ].targetname, self );
  3699. }
  3700.  
  3701. }
  3702.  
  3703. harrybo21_perks_vulture( give )
  3704. {
  3705. self endon( "disconnect" );
  3706. if ( give )
  3707. {
  3708. self harrybo21_reveal_vulture_huds( true );
  3709. self.touching_mist = undefined;
  3710. self.vulture_level = 0;
  3711. self.vulture_drops = 0;
  3712. self thread harrybo21_perks_vulture_hud_mist_effect();
  3713. self thread harrybo21_perks_vulture_mist_watcher();
  3714. self thread harrybo21_perks_vulture_ammo_csc_watcher();
  3715. self thread harrybo21_perks_vulture_points_csc_watcher();
  3716. }
  3717. else
  3718. {
  3719. self harrybo21_reveal_vulture_huds( false );
  3720. self notify( "vulture_over" );
  3721. self.vulture_level = 0;
  3722. self setblur( 0, 1 );
  3723. self.vulture_drops = undefined;
  3724. self.vulture_glow_hud destroy();
  3725. self.vulture_glow_hud = undefined;
  3726. self notify( "lost_specialty_ordinance" );
  3727. }
  3728. }
  3729.  
  3730. harrybo21_perks_vulture_points_csc_watcher()
  3731. {
  3732. self endon( "lost_specialty_ordinance" );
  3733. while( 1 )
  3734. {
  3735. self waittill( "vulture_points_collected" );
  3736.  
  3737. score = 10;
  3738. rand = randomInt( 2 );
  3739. if ( rand == 1 )
  3740. score = 20;
  3741.  
  3742. if ( level.zombie_vars[ "zombie_powerup_point_doubler_on" ] )
  3743. score = score * 2;
  3744.  
  3745. self.score += score;
  3746. self maps\_zombiemode_score::set_player_score_hud();
  3747. }
  3748. }
  3749.  
  3750. harrybo21_perks_vulture_ammo_csc_watcher()
  3751. {
  3752. self endon( "lost_specialty_ordinance" );
  3753. while( 1 )
  3754. {
  3755. self waittill( "vulture_ammo_collected" );
  3756.  
  3757. current_weapon = self getCurrentWeapon();
  3758.  
  3759. current_ammo = self getWeaponAmmoStock( current_weapon );
  3760. weapon_max = weaponMaxAmmo( current_weapon );
  3761. clip = WeaponClipSize( current_weapon );
  3762. clip_add = int( clip / 10 );
  3763. if ( clip_add < 1 )
  3764. clip_add = 1;
  3765.  
  3766. new_ammo = current_ammo + clip_add;
  3767. if ( new_ammo > weapon_max )
  3768. new_ammo = weapon_max;
  3769.  
  3770. self SetWeaponAmmoStock( current_weapon, new_ammo );
  3771. }
  3772. }
  3773.  
  3774. harrybo21_perks_vulture_lose_watcher( player )
  3775. {
  3776. self endon( "delete" );
  3777. player endon( "disconnect" );
  3778. player waittill( "vulture_over" );
  3779. self delete();
  3780. }
  3781.  
  3782. harrybo21_perks_vulture_should_do_drop()
  3783. {
  3784. n_roll = randomint( 100 );
  3785. b_should_drop = n_roll > ( 100 - level.zombie_vars[ "vulture_drop_chance" ] );
  3786. return b_should_drop;
  3787. }
  3788.  
  3789. harrybo21_perks_vulture_zombie_function()
  3790. {
  3791. if( ( isdefined( self.boss ) && self.boss ) || ( isDefined( self.boss_mech ) && self.boss_mech ) || ( isDefined( self.animname ) && ( self.animname == "boss_zombie" || self.animname == "sonic_zombie" || self.animname == "napalm_zombie" ) ) )
  3792. return;
  3793. if ( self enemy_is_dog() && !level.zombie_vars[ "vulture_on_dogs" ] )
  3794. return;
  3795.  
  3796. if ( !harrybo21_perks_vulture_should_do_drop() )
  3797. return;
  3798.  
  3799. n_total_weight = level.zombie_vars[ "vulture_ammo_chance" ] + level.zombie_vars[ "vulture_points_chance" ] + level.zombie_vars[ "vulture_stink_chance" ];
  3800. n_cutoff_ammo = level.zombie_vars[ "vulture_ammo_chance" ];
  3801. n_cutoff_points = level.zombie_vars[ "vulture_ammo_chance" ] + level.zombie_vars[ "vulture_points_chance" ];
  3802. n_roll = randomint( n_total_weight );
  3803. if ( n_roll < n_cutoff_ammo )
  3804. str_bonus = "ammo";
  3805. else if ( n_roll > n_cutoff_ammo && n_roll < n_cutoff_points )
  3806. str_bonus = "points";
  3807. else
  3808. str_bonus = "stink";
  3809.  
  3810. if ( str_bonus == "stink" )
  3811. self thread harrybo21_perks_vulture_zombie_mist_watcher();
  3812. if ( str_bonus == "points" )
  3813. self thread harrybo21_perks_vulture_zombie_drop( "points" );
  3814. if ( str_bonus == "ammo" )
  3815. self thread harrybo21_perks_vulture_zombie_drop( "ammo" );
  3816.  
  3817. }
  3818.  
  3819. harrybo21_perks_vulture_zombie_drop( type )
  3820. {
  3821. self endon( "cancel" );
  3822. self waittill( "death" );
  3823. if( ( isdefined( self.boss ) && self.boss ) || ( isDefined( self.boss_mech ) && self.boss_mech ) || ( isDefined( self.animname ) && ( self.animname == "boss_zombie" || self.animname == "sonic_zombie" || self.animname == "napalm_zombie" ) ) )
  3824. return;
  3825. if( isDefined( self.attacker ) && isPlayer( self.attacker ) && self.attacker hasPerk( "specialty_ordinance" ) && harry_in_playable_area_check( self.origin ) )
  3826. {
  3827. if ( isDefined( type ) && type == "ammo" )
  3828. SetClientSysState( "zombiemode_perks", "vulture_ammo_spawn," + int( self.origin[ 0 ] ) + "," + int( self.origin[ 1 ] ) + "," + int( self.origin[ 2 ] ), self.attacker );
  3829. else if ( isDefined( type ) && type == "points" )
  3830. SetClientSysState( "zombiemode_perks", "vulture_points_spawn," + int( self.origin[ 0 ] ) + "," + int( self.origin[ 1 ] ) + "," + int( self.origin[ 2 ] ), self.attacker );
  3831.  
  3832. }
  3833. }
  3834.  
  3835. harrybo21_perks_vulture_zombie_mist_watcher()
  3836. {
  3837. vulture_mists = harrybo21_perks_vulture_get_mists();
  3838. if ( vulture_mists.size >= level.zombie_vars[ "vulture_max_stink_zombies" ] )
  3839. return;
  3840.  
  3841. vulture_mist = spawn( "script_model", self.origin + ( 0, 0, 16 ), 1, 1, 1 );
  3842. vulture_mist.linked = true;
  3843. vulture_mist playloopSound( "vulture_mist_loop", 1 );
  3844. vulture_mist.targetname = "vulture_mist";
  3845. vulture_mist.angles = self.angles;
  3846. vulture_mist setmodel( "tag_origin" );
  3847.  
  3848. vulture_mist linkTo( self, "tag_origin" );
  3849. vulture_mist thread harrybo21_perks_vulture_mist_fx( "tag_origin", level._effect[ "vulture_mist" ] );
  3850.  
  3851. self waittill( "death" );
  3852. vulture_mist.linked = false;
  3853. if ( !harrybo21_perks_vulture_can_drop( vulture_mist ) )
  3854. {
  3855. vulture_mist stoploopsound( 2 );
  3856. vulture_mist stopsounds( 2 );
  3857. vulture_mist notify( "stop_vulture_fx" );
  3858. wait 2;
  3859. vulture_mist delete();
  3860. vulture_mist = undefined;
  3861. return;
  3862. }
  3863.  
  3864. vulture_mist unlink();
  3865. wait level.zombie_vars[ "vulture_mist_time" ];
  3866. vulture_mist stoploopsound( 2 );
  3867. vulture_mist stopsounds( 2 );
  3868. vulture_mist notify( "stop_vulture_fx" );
  3869. wait 20;
  3870. vulture_mist delete();
  3871. vulture_mist = undefined;
  3872. }
  3873.  
  3874. harrybo21_perks_vulture_get_mists()
  3875. {
  3876. return getEntArray( "vulture_mist", "targetname" );
  3877. }
  3878.  
  3879. harrybo21_perks_vulture_mist_watcher()
  3880. {
  3881. self endon( "disconnect" );
  3882. self endon( "player_downed" );
  3883. self endon( "fake_death" );
  3884. touched = false;
  3885. while( 1 )
  3886. {
  3887. touching = false;
  3888. vulture_mists = harrybo21_perks_vulture_get_mists();
  3889. for ( i = 0; i < vulture_mists.size; i++ )
  3890. {
  3891. if ( self hasPerk( "specialty_ordinance" ) && distance( vulture_mists[ i ].origin, self.origin ) < 48 && !vulture_mists[ i ].linked )
  3892. {
  3893. touching = true;
  3894. if ( !touched )
  3895. {
  3896. self playSound( "vulture_mist_start" );
  3897. touched = true;
  3898. }
  3899.  
  3900. if ( self.vulture_level + .1 < 1 )
  3901. self.vulture_level += .1;
  3902. else
  3903. self.vulture_level = 1;
  3904.  
  3905. self setblur( self.vulture_level, .01 );
  3906. break;
  3907. }
  3908. }
  3909.  
  3910. if ( touching )
  3911. {
  3912. if ( ( !isDefined( self.vulture_mist ) || !self.vulture_mist ) && self.vulture_level >= 1 )
  3913. {
  3914. self.vulture_mist = true;
  3915. self.ignoreme = true;
  3916. }
  3917. wait .25;
  3918. continue;
  3919. }
  3920. else
  3921. {
  3922. if ( touched )
  3923. {
  3924. self playSound( "vulture_mist_stop" );
  3925. touched = false;
  3926. }
  3927. }
  3928. if ( self.vulture_level - .1 >= 0 )
  3929. {
  3930. self.vulture_level -= .1;
  3931. self setblur( self.vulture_level, .01 );
  3932. }
  3933. else
  3934. self.vulture_level = 0;
  3935.  
  3936. if ( !self maps\_laststand::player_is_in_laststand() && !self.last_stand && ( isDefined( self.vulture_mist ) && self.vulture_mist ) && self.vulture_level <= 0 )
  3937. {
  3938. self.vulture_mist = false;
  3939. self.ignoreme = false;
  3940. }
  3941.  
  3942. wait .25;
  3943. }
  3944. }
  3945.  
  3946. harrybo21_perks_vulture_hud_mist_effect()
  3947. {
  3948. self endon( "disconnect" );
  3949. self endon( "player_downed" );
  3950. self endon( "fake_death" );
  3951. colour = 0;
  3952. self.vulture_glow_hud = NewClientHudElem( self );
  3953. self.vulture_glow_hud.foreground = true;
  3954. self.vulture_glow_hud.sort = 1;
  3955. self.vulture_glow_hud.hidewheninmenu = false;
  3956. self.vulture_glow_hud.alignX = "left";
  3957. self.vulture_glow_hud.alignY = "bottom";
  3958. self.vulture_glow_hud.horzAlign = "left";
  3959. self.vulture_glow_hud.vertAlign = "bottom";
  3960. self.vulture_glow_hud.x = 0;
  3961. self.vulture_glow_hud.y = 0;
  3962. self.vulture_glow_hud.alpha = 0;
  3963. self.vulture_glow_hud SetShader( "vending_vulture_glow_shader" , 48, 48 );
  3964. self.vulture_glow_hud.alpha = 0;
  3965. glow = true;
  3966. while( 1 )
  3967. {
  3968. for ( i = 0; i < self.perk_hud.size; i++ )
  3969. {
  3970. if ( self.perk_hud[ i ].perk == "specialty_ordinance" )
  3971. {
  3972. self.vulture_glow_hud.x = self.perk_hud[ i ].x - 12;
  3973. self.vulture_glow_hud.y = self.perk_hud[ i ].y + 12;
  3974. self.vulture_glow_hud.alpha = self.vulture_level;
  3975. }
  3976. }
  3977.  
  3978. wait .1;
  3979. }
  3980. }
  3981.  
  3982. harrybo21_perks_vulture_mist_fx( tag, fx )
  3983. {
  3984. self endon( "stop_vulture_fx" );
  3985.  
  3986. while( 1 )
  3987. {
  3988. playfxontag( fx, self, tag );
  3989. players = get_players();
  3990. for( i = 0; i < players.size; i++ )
  3991. {
  3992. if( players[ i ] hasPerk( "specialty_ordinance" ) )
  3993. self SetVisibleToPlayer( players[ i ] );
  3994. else
  3995. self SetInvisibleToPlayer( players[ i ] );
  3996.  
  3997. }
  3998. wait randomfloatrange( 0.1, 0.2 );
  3999. }
  4000. }
  4001.  
  4002. harrybo21_perks_vulture_can_drop( object )
  4003. {
  4004. playable_area = getEntArray( "playable_area", "targetname" );
  4005. for ( i = 0; i < playable_area.size; i++ )
  4006. {
  4007. if ( object isTouching( playable_area[ i ] ) )
  4008. {
  4009. return true;
  4010. }
  4011. }
  4012. return false;
  4013. }
  4014.  
  4015. // Widows Wine Functionality ( "specialty_specialgrenade" ) ==============================================================================================
  4016.  
  4017. harrybo21_perks_widows_wine( give )
  4018. {
  4019. self endon( "disconnect" );
  4020. if ( give )
  4021. {
  4022. self.previous_grenade = self harrybo21_get_grenade();
  4023. ammo = 0;
  4024. if ( isDefined( self.previous_grenade ) )
  4025. ammo = self getWeaponAmmoClip( self.previous_grenade );
  4026. else
  4027. self.previous_grenade = "fraggrenade";
  4028.  
  4029. self harrybo21_set_grenade( "bo3_zm_widows_grenade", ammo );
  4030. self thread harrybo21_perks_widows_grenade_csc_watcher();
  4031. }
  4032. else
  4033. {
  4034. ammo = self getWeaponAmmoClip( "bo3_zm_widows_grenade" );
  4035. if ( !isDefined( ammo ) )
  4036. ammo = 0;
  4037.  
  4038. self harrybo21_set_grenade( self.previous_grenade, ammo );
  4039. }
  4040. }
  4041.  
  4042. harrybo21_perks_widows_grenade_csc_watcher()
  4043. {
  4044. self endon( "disconnect" );
  4045. self endon( "death" );
  4046. while( 1 )
  4047. {
  4048. self waittill( "widows_grenade_collected" );
  4049. // playsoundatposition( "powerup_grabbed", self.origin );
  4050.  
  4051. clip_ammo = self GetWeaponAmmoClip( "bo3_zm_widows_grenade" );
  4052. if ( !isDefined( clip_ammo ) )
  4053. clip_ammo = 0;
  4054.  
  4055. clip_ammo += 1;
  4056. if ( clip_ammo > 4 )
  4057. clip_ammo = 4;
  4058.  
  4059. self setWeaponAmmoClip( "bo3_zm_widows_grenade", clip_ammo );
  4060. }
  4061. }
  4062.  
  4063. harrybo21_perks_widows_wine_watch_for_throw()
  4064. {
  4065. while( 1 )
  4066. {
  4067. self waittill( "grenade_fire", grenade, weapname );
  4068. if ( weapname != "bo3_zm_widows_grenade" )
  4069. continue;
  4070.  
  4071. self thread harrybo21_perks_widows_wine_thrown( grenade );
  4072. }
  4073. }
  4074.  
  4075. harrybo21_perks_widows_wine_hud_watcher()
  4076. {
  4077. huds = [];
  4078. players = get_players();
  4079. for ( i = 0; i < players.size; i++ )
  4080. {
  4081. hud_elem = NewClientHudElem( players[ i ] );
  4082. hud_elem.x = self.origin[ 0 ];
  4083. hud_elem.y = self.origin[ 1 ];
  4084. hud_elem.z = self.origin[ 2 ];
  4085. hud_elem setWaypoint( false, "vending_widows_grenade_indicator" );
  4086. hud_elem.hidewheninmenu = 1;
  4087. hud_elem.immunetodemogamehudsettings = 1;
  4088. huds[ i ] = hud_elem;
  4089. }
  4090.  
  4091. while( isDefined( self ) )
  4092. {
  4093. for ( i = 0; i < players.size; i++ )
  4094. {
  4095. distance_to_grenade = distance( players[ i ].origin, self.origin ) / ( level.zombie_vars[ "widows_wine_max_range" ] * 3 );
  4096. if ( distance_to_grenade > 1 )
  4097. distance_to_grenade = 1;
  4098. if ( distance_to_grenade < 0 )
  4099. distance_to_grenade = 0;
  4100.  
  4101. huds[ i ].alpha = 1 - distance_to_grenade;
  4102. }
  4103. wait .05;
  4104. }
  4105. for ( i = 0; i < huds.size; i++ )
  4106. {
  4107. huds[ i ] destroy();
  4108. huds[ i ] delete();
  4109. }
  4110. huds = undefined;
  4111. }
  4112.  
  4113. harrybo21_perks_widows_wine_thrown( grenade )
  4114. {
  4115. self endon( "delete" );
  4116. self endon( "destroy" );
  4117. self endon( "detonate" );
  4118. grenade waittill_not_moving();
  4119.  
  4120. fake_model = spawn( "script_model", grenade.origin );
  4121. fake_model setModel( "t7_ww_grenade_proj" );
  4122. fake_model.angles = grenade.angles;
  4123. grenade delete();
  4124.  
  4125. fake_model.owner = self;
  4126. wait 1;
  4127. fake_model thread harrybo21_perks_widows_wine_explode( self );
  4128. fake_model delete();
  4129. }
  4130.  
  4131. harrybo21_perks_widows_wine_explode( owner )
  4132. {
  4133. origin = self.origin;
  4134. earthquake ( 0.8, 0.6, origin, level.zombie_vars[ "widows_wine_max_range" ] );
  4135. self playSound( "grenade_explode" );
  4136.  
  4137. playsoundatposition ( "mx_widows_explode", origin );
  4138. playFX( level._effect[ "widows_wine_explode" ], origin );
  4139.  
  4140. ai = GetAiSpeciesArray( "axis", "all" );
  4141. ai = get_array_of_closest( origin, ai );
  4142. n_zombies_hit = 0;
  4143. for( i = 0; i < ai.size; i++ )
  4144. {
  4145. if ( distance( origin, ai[ i ].origin ) > level.zombie_vars[ "widows_wine_max_range" ] )
  4146. continue;
  4147.  
  4148. if ( isDefined( ai[ i ].widow_stunned ) && ai[ i ].widow_stunned )
  4149. continue;
  4150.  
  4151. if( ( isdefined( ai[ i ].boss ) && ai[ i ].boss ) || ( isDefined( ai[ i ].boss_mech ) && ai[ i ].boss_mech ) || ( isDefined( ai[ i ].animname ) && ( ai[ i ].animname == "boss_zombie" || ai[ i ].animname == "sonic_zombie" || ai[ i ].animname == "napalm_zombie" ) ) )
  4152. continue;
  4153.  
  4154. if ( ai[ i ] enemy_is_dog() )
  4155. {
  4156. ai[ i ] doDamage( ai[ i ].health + 666, self.origin, owner );
  4157. continue;
  4158. }
  4159.  
  4160. ai[ i ] thread harrybo21_perks_do_gib( owner );
  4161. ai[ i ] thread harrybo21_perks_widows_wine_should_do_drop( owner );
  4162. ai[ i ] thread harrybo21_perks_widows_wine_stunned();
  4163. ai[ i ] thread harrybo21_perks_widows_wine_damage_over_time( owner );
  4164. ai[ i ] thread harrybo21_perks_widows_wine_infected_fx( owner );
  4165. ai[ i ] doDamage( ( self.maxHealth / level.zombie_vars[ "widows_wine_max_damage" ] ) / 20, self.origin, self );
  4166. }
  4167. }
  4168.  
  4169. harrybo21_perks_widows_wine_should_do_drop( owner )
  4170. {
  4171. self endon( "delete" );
  4172. self waittill( "death" );
  4173.  
  4174. if ( isDefined( level.zombie_vars[ "zombie_drop_item" ] ) && level.zombie_vars[ "zombie_drop_item" ] >= 1 )
  4175. return;
  4176. if( ( isdefined( self.boss ) && self.boss ) || ( isDefined( self.boss_mech ) && self.boss_mech ) || ( isDefined( self.animname ) && ( self.animname == "boss_zombie" || self.animname == "sonic_zombie" || self.animname == "napalm_zombie" ) ) )
  4177. return;
  4178.  
  4179. n_roll = randomint( 100 );
  4180. b_should_drop = n_roll > ( 100 - level.zombie_vars[ "widows_wine_drop_chance" ] );
  4181. if ( !b_should_drop )
  4182. return;
  4183. if ( owner maps\_laststand::player_is_in_laststand() || !isAlive( owner ) )
  4184. return;
  4185. if ( !harry_in_playable_area_check( self.origin + ( 0, 0, 40 ) ) )
  4186. return;
  4187.  
  4188. SetClientSysState( "zombiemode_perks", "widows_grenade_spawn," + int( self.origin[ 0 ] ) + "," + int( self.origin[ 1 ] ) + "," + int( self.origin[ 2 ] ), owner );
  4189. }
  4190.  
  4191. harrybo21_perks_widows_wine_infected_fx()
  4192. {
  4193. self endon( "delete" );
  4194. self endon( "widows_effects_over" );
  4195. self playLoopSound( "ww_lp" );
  4196. while( 1 )
  4197. {
  4198. spot = self getTagOrigin( "j_spinelower" );
  4199. playFX( level._effect[ "widows_wine_zombie" ], spot );
  4200. wait .5;
  4201. }
  4202. }
  4203.  
  4204. harrybo21_perks_widows_wine_explode_on_melee()
  4205. {
  4206. if ( isDefined( self.widows_exploded ) )
  4207. return false;
  4208.  
  4209. clip_ammo = self GetWeaponAmmoClip( "bo3_zm_widows_grenade" );
  4210. if ( !self hasPerk( "specialty_specialgrenade" ) || clip_ammo < 1 )
  4211. return false;
  4212.  
  4213. if ( !isDefined( clip_ammo ) )
  4214. clip_ammo = 0;
  4215.  
  4216. clip_ammo--;
  4217. if ( clip_ammo < 0 )
  4218. clip_ammo = 0;
  4219.  
  4220. self setWeaponAmmoClip( "bo3_zm_widows_grenade", clip_ammo );
  4221. self.widows_exploded = 1;
  4222. self thread harrybo21_perks_widows_wine_explode( self );
  4223. self thread harrybo21_perks_widows_wine_cooldown_timer();
  4224. self EnableInvulnerability();
  4225. wait .25;
  4226. self DisableInvulnerability();
  4227. return true;
  4228. }
  4229.  
  4230. harrybo21_perks_widows_wine_cooldown_timer()
  4231. {
  4232. wait 2;
  4233. self.widows_exploded = undefined;
  4234. }
  4235.  
  4236. harrybo21_perks_widows_wine_damage_over_time( attacker )
  4237. {
  4238. self endon( "death" );
  4239. self endon( "widows_effects_over" );
  4240.  
  4241. dmg = ( self.maxHealth / level.zombie_vars[ "widows_wine_max_damage" ] ) / 20;
  4242.  
  4243. if( !isAlive( self ) )
  4244. return;
  4245.  
  4246. if( !isPlayer( attacker ) )
  4247. attacker = undefined;
  4248.  
  4249. while( 1 )
  4250. {
  4251. wait 1 ;
  4252.  
  4253. if( isDefined( attacker ) )
  4254. self doDamage( dmg, self.origin, attacker );
  4255. else
  4256. self doDamage( dmg, self.origin );
  4257.  
  4258. }
  4259. }
  4260.  
  4261. harrybo21_perks_widows_wine_stunned()
  4262. {
  4263. self endon( "death" );
  4264. self endon( "delete" );
  4265. if ( isDefined( self.widow_stunned ) )
  4266. return;
  4267.  
  4268. self.widow_stunned = 1;
  4269. count = 1;
  4270. while( 1 )
  4271. {
  4272. count -= 0.05;
  4273. self.melee_anim_rate = count;
  4274. self.moveplaybackrate = count;
  4275. self.animplaybackrate = count;
  4276. self.traverseplaybackrate = count;
  4277.  
  4278. if ( count <= 0.15 )
  4279. break;
  4280.  
  4281. wait 0.05;
  4282. }
  4283. wait 20;
  4284. while( 1 )
  4285. {
  4286. count += 0.05;
  4287. self.melee_anim_rate = count;
  4288. self.moveplaybackrate = count;
  4289. self.animplaybackrate = count;
  4290. self.traverseplaybackrate = count;
  4291.  
  4292. if ( count >= 1 )
  4293. break;
  4294.  
  4295. wait .05;
  4296. }
  4297. self notify( "widows_effects_over" );
  4298. self stopLoopSound( "ww_lp" );
  4299. self playSound( "ww_lp_end" );
  4300. self.widow_stunned = undefined;
  4301. }
  4302.  
  4303. harrybo21_perks_widows_watcher()
  4304. {
  4305. self endon( "death" );
  4306. while( 1 )
  4307. {
  4308. self waittill( "damage", amount, attacker, direction_vec, point, type );
  4309.  
  4310. if( ( isdefined( self.boss ) && self.boss ) || self.animname == "jnaut_melee" || self.animname == "jnaut_gunner" || ( isDefined( self.boss_mech ) && self.boss_mech )|| ( isDefined( self.animname ) && self.animname == "boss_zombie" ) )
  4311. return;
  4312.  
  4313. if ( type == "MOD_MELEE" )
  4314. {
  4315. self.widows_hit = true;
  4316. if( isDefined( attacker ) && isplayer( attacker ) && isAlive( attacker ) )
  4317. {
  4318. if( attacker hasPerk( "specialty_specialgrenade" ) )
  4319. {
  4320. self harrybo21_perks_widows_damage( level.zombie_vars[ "widows_wine_max_melee_damage" ], self.origin, attacker, self.damageLocation );
  4321. if ( isAlive( self ) )
  4322. {
  4323. if ( isDefined( self.widow_stunned ) && self.widow_stunned )
  4324. continue;
  4325.  
  4326. self thread harrybo21_perks_widows_wine_should_do_drop( attacker );
  4327. self thread harrybo21_perks_widows_wine_stunned();
  4328. self thread harrybo21_perks_widows_wine_damage_over_time( self );
  4329. self thread harrybo21_perks_widows_wine_infected_fx( self );
  4330. }
  4331. }
  4332. }
  4333. }
  4334. wait_network_frame();
  4335. }
  4336. }
  4337.  
  4338. harrybo21_perks_widows_damage( amount, origin, attacker, location )
  4339. {
  4340. self endon( "death" );
  4341. self.damageLocation = location;
  4342. setPlayerIgnoreRadiusDamage( true );
  4343. attacker radiusDamage( self.origin, 1, amount, amount, attacker, "MOD_MELEE" );
  4344. setPlayerIgnoreRadiusDamage( false );
  4345. self.damageLocation = location;
  4346. wait_network_frame();
  4347. }
  4348.  
  4349. // Stock functions called from other scripts ==============================================================================================
  4350.  
  4351. perk_think( perk )
  4352. {
  4353. self harrybo21_perks_give_perk( perk );
  4354. }
  4355.  
  4356. play_no_money_perk_dialog()
  4357. {
  4358. index = maps\_zombiemode_weapons::get_player_index( self );
  4359. player_index = "plr_" + index + "_";
  4360. if( !IsDefined ( self.vox_nomoney_perk ) )
  4361. {
  4362. num_variants = maps\_zombiemode_spawner::get_number_variants( player_index + "vox_nomoney_perk" );
  4363. self.vox_nomoney_perk = [];
  4364. for( i = 0; i < num_variants; i++ )
  4365. self.vox_nomoney_perk[self.vox_nomoney_perk.size] = "vox_nomoney_perk_" + i;
  4366.  
  4367. self.vox_nomoney_perk_available = self.vox_nomoney_perk;
  4368. }
  4369. sound_to_play = random( self.vox_nomoney_perk_available );
  4370.  
  4371. self.vox_nomoney_perk_available = array_remove( self.vox_nomoney_perk_available, sound_to_play );
  4372.  
  4373. if ( self.vox_nomoney_perk_available.size < 1 )
  4374. self.vox_nomoney_perk_available = self.vox_nomoney_perk;
  4375.  
  4376. self maps\_zombiemode_spawner::do_player_playdialog(player_index, sound_to_play, 0.25 );
  4377. }
  4378.  
  4379. // Added by Wunderful for Bam's electric cherry
  4380.  
  4381. perk_hud_destroy( perk )
  4382. {
  4383. self.perk_hud[ perk ] destroy_hud();
  4384. self.perk_hud[ perk ] = undefined;
  4385. }
  4386.  
  4387. perk_vo(type)
  4388. {
  4389. self endon("death");
  4390. self endon("disconnect");
  4391.  
  4392. index = maps\_zombiemode_weapons::get_player_index(self);
  4393. sound = undefined;
  4394.  
  4395. if(!isdefined (level.player_is_speaking))
  4396. {
  4397. level.player_is_speaking = 0;
  4398. }
  4399. player_index = "plr_" + index + "_";
  4400. //wait(randomfloatrange(1,2));
  4401.  
  4402. //TUEY We need to eventually store the dialog in an array so you can add multiple variants...but we only have 1 now anyway.
  4403. switch(type)
  4404. {
  4405. case "specialty_armorvest":
  4406. sound_to_play = "vox_perk_jugga_0";
  4407. break;
  4408. case "specialty_fastreload":
  4409. sound_to_play = "vox_perk_speed_0";
  4410. break;
  4411. case "specialty_quickrevive":
  4412. sound_to_play = "vox_perk_revive_0";
  4413. break;
  4414. case "specialty_rof":
  4415. sound_to_play = "vox_perk_doubletap_0";
  4416. break;
  4417. default:
  4418. sound_to_play = "vox_perk_jugga_0";
  4419. break;
  4420. }
  4421.  
  4422. wait(1.0);
  4423. self maps\_zombiemode_spawner::do_player_playdialog(player_index, sound_to_play, 0.25);
  4424. }
  4425.  
  4426. play_vendor_stings(sound)
  4427. {
  4428. if(!IsDefined (level.speed_jingle))
  4429. {
  4430. level.speed_jingle = 0;
  4431. }
  4432. if(!IsDefined (level.revive_jingle))
  4433. {
  4434. level.revive_jingle = 0;
  4435. }
  4436. if(!IsDefined (level.doubletap_jingle))
  4437. {
  4438. level.doubletap_jingle = 0;
  4439. }
  4440. if(!IsDefined (level.jugger_jingle))
  4441. {
  4442. level.jugger_jingle = 0;
  4443. }
  4444. if(!IsDefined (level.packa_jingle))
  4445. {
  4446. level.packa_jingle = 0;
  4447. }
  4448. if(!IsDefined (level.eggs))
  4449. {
  4450. level.eggs = 0;
  4451. }
  4452. if (level.eggs == 0)
  4453. {
  4454. if(sound == "mx_speed_sting" && level.speed_jingle == 0 )
  4455. {
  4456. // iprintlnbold("stinger speed:" + level.speed_jingle);
  4457. level.speed_jingle = 1;
  4458. temp_org_speed_s = spawn("script_origin", self.origin);
  4459. temp_org_speed_s playsound (sound, "sound_done");
  4460. temp_org_speed_s waittill("sound_done");
  4461. level.speed_jingle = 0;
  4462. temp_org_speed_s delete();
  4463. // iprintlnbold("stinger speed:" + level.speed_jingle);
  4464. }
  4465. else if(sound == "mx_revive_sting" && level.revive_jingle == 0)
  4466. {
  4467. level.revive_jingle = 1;
  4468. // iprintlnbold("stinger revive:" + level.revive_jingle);
  4469. temp_org_revive_s = spawn("script_origin", self.origin);
  4470. temp_org_revive_s playsound (sound, "sound_done");
  4471. temp_org_revive_s waittill("sound_done");
  4472. level.revive_jingle = 0;
  4473. temp_org_revive_s delete();
  4474. // iprintlnbold("stinger revive:" + level.revive_jingle);
  4475. }
  4476. else if(sound == "mx_doubletap_sting" && level.doubletap_jingle == 0)
  4477. {
  4478. level.doubletap_jingle = 1;
  4479. // iprintlnbold("stinger double:" + level.doubletap_jingle);
  4480. temp_org_dp_s = spawn("script_origin", self.origin);
  4481. temp_org_dp_s playsound (sound, "sound_done");
  4482. temp_org_dp_s waittill("sound_done");
  4483. level.doubletap_jingle = 0;
  4484. temp_org_dp_s delete();
  4485. // iprintlnbold("stinger double:" + level.doubletap_jingle);
  4486. }
  4487. else if(sound == "mx_jugger_sting" && level.jugger_jingle == 0)
  4488. {
  4489. level.jugger_jingle = 1;
  4490. // iprintlnbold("stinger juggernog" + level.jugger_jingle);
  4491. temp_org_jugs_s = spawn("script_origin", self.origin);
  4492. temp_org_jugs_s playsound (sound, "sound_done");
  4493. temp_org_jugs_s waittill("sound_done");
  4494. level.jugger_jingle = 0;
  4495. temp_org_jugs_s delete();
  4496. // iprintlnbold("stinger juggernog:" + level.jugger_jingle);
  4497. }
  4498. else if(sound == "mx_packa_sting" && level.packa_jingle == 0)
  4499. {
  4500. level.packa_jingle = 1;
  4501. // iprintlnbold("stinger packapunch:" + level.packa_jingle);
  4502. temp_org_pack_s = spawn("script_origin", self.origin);
  4503. temp_org_pack_s playsound (sound, "sound_done");
  4504. temp_org_pack_s waittill("sound_done");
  4505. level.packa_jingle = 0;
  4506. temp_org_pack_s delete();
  4507. // iprintlnbold("stinger packapunch:" + level.packa_jingle);
  4508. }
  4509. }
  4510. }
  4511.  
  4512. machine_watcher_factory(vending_name)
  4513. {
  4514. level waittill(vending_name);
  4515. switch(vending_name)
  4516. {
  4517. case "juggernog_on":
  4518. temp_script_sound = "mx_jugger_jingle";
  4519. break;
  4520.  
  4521. case "sleight_on":
  4522. temp_script_sound = "mx_speed_jingle";
  4523. break;
  4524.  
  4525. case "doubletap_on":
  4526. temp_script_sound = "mx_doubletap_jingle";
  4527. break;
  4528.  
  4529. case "revive_on":
  4530. temp_script_sound = "mx_revive_jingle";
  4531. break;
  4532.  
  4533. case "Pack_A_Punch_on":
  4534. temp_script_sound = "mx_packa_jingle";
  4535. break;
  4536.  
  4537. default:
  4538. temp_script_sound = "mx_jugger_jingle";
  4539. break;
  4540. }
  4541.  
  4542.  
  4543. temp_machines = getstructarray("perksacola", "targetname");
  4544. for (x = 0; x < temp_machines.size; x++)
  4545. {
  4546. if (temp_machines[x].script_sound == temp_script_sound)
  4547. temp_machines[x] thread perks_a_cola_jingle();
  4548. }
  4549.  
  4550. }
  4551.  
  4552. perk_fx( fx )
  4553. {
  4554. wait(3);
  4555. playfxontag( level._effect[ fx ], self, "tag_origin" );
  4556. }
  4557.  
  4558. perks_a_cola_jingle()
  4559. {
  4560. self thread play_random_broken_sounds();
  4561. if(!IsDefined(self.perk_jingle_playing))
  4562. {
  4563. self.perk_jingle_playing = 0;
  4564. }
  4565. if (!IsDefined (level.eggs))
  4566. {
  4567. level.eggs = 0;
  4568. }
  4569. while(1)
  4570. {
  4571. //wait(randomfloatrange(60, 120));
  4572. wait(randomfloatrange(31,45));
  4573. if(randomint(100) < 15 && level.eggs == 0)
  4574. {
  4575. level notify ("jingle_playing");
  4576. //playfx (level._effect["electric_short_oneshot"], self.origin);
  4577. playsoundatposition ("electrical_surge", self.origin);
  4578.  
  4579. if(self.script_sound == "mx_speed_jingle" && level.speed_jingle == 0)
  4580. {
  4581. level.speed_jingle = 1;
  4582. temp_org_speed = spawn("script_origin", self.origin);
  4583. wait(0.05);
  4584. temp_org_speed playsound (self.script_sound, "sound_done");
  4585. temp_org_speed waittill("sound_done");
  4586. level.speed_jingle = 0;
  4587. temp_org_speed delete();
  4588. }
  4589. if(self.script_sound == "mx_revive_jingle" && level.revive_jingle == 0)
  4590. {
  4591. level.revive_jingle = 1;
  4592. temp_org_revive = spawn("script_origin", self.origin);
  4593. wait(0.05);
  4594. temp_org_revive playsound (self.script_sound, "sound_done");
  4595. temp_org_revive waittill("sound_done");
  4596. level.revive_jingle = 0;
  4597. temp_org_revive delete();
  4598. }
  4599. if(self.script_sound == "mx_doubletap_jingle" && level.doubletap_jingle == 0)
  4600. {
  4601. level.doubletap_jingle = 1;
  4602. temp_org_doubletap = spawn("script_origin", self.origin);
  4603. wait(0.05);
  4604. temp_org_doubletap playsound (self.script_sound, "sound_done");
  4605. temp_org_doubletap waittill("sound_done");
  4606. level.doubletap_jingle = 0;
  4607. temp_org_doubletap delete();
  4608. }
  4609. if(self.script_sound == "mx_jugger_jingle" && level.jugger_jingle == 0)
  4610. {
  4611. level.jugger_jingle = 1;
  4612. temp_org_jugger = spawn("script_origin", self.origin);
  4613. wait(0.05);
  4614. temp_org_jugger playsound (self.script_sound, "sound_done");
  4615. temp_org_jugger waittill("sound_done");
  4616. level.jugger_jingle = 0;
  4617. temp_org_jugger delete();
  4618. }
  4619. if(self.script_sound == "mx_packa_jingle" && level.packa_jingle == 0)
  4620. {
  4621. level.packa_jingle = 1;
  4622. temp_org_packa = spawn("script_origin", self.origin);
  4623. temp_org_packa playsound (self.script_sound, "sound_done");
  4624. temp_org_packa waittill("sound_done");
  4625. level.packa_jingle = 0;
  4626. temp_org_packa delete();
  4627. }
  4628.  
  4629. self thread play_random_broken_sounds();
  4630. }
  4631. }
  4632. }
  4633. play_random_broken_sounds()
  4634. {
  4635. level endon ("jingle_playing");
  4636. if (!isdefined (self.script_sound))
  4637. {
  4638. self.script_sound = "null";
  4639. }
  4640. if (self.script_sound == "mx_revive_jingle")
  4641. {
  4642. while(1)
  4643. {
  4644. wait(randomfloatrange(7, 18));
  4645. playsoundatposition ("broken_random_jingle", self.origin);
  4646. //playfx (level._effect["electric_short_oneshot"], self.origin);
  4647. playsoundatposition ("electrical_surge", self.origin);
  4648.  
  4649. }
  4650. }
  4651. else
  4652. {
  4653. while(1)
  4654. {
  4655. wait(randomfloatrange(7, 18));
  4656. // playfx (level._effect["electric_short_oneshot"], self.origin);
  4657. playsoundatposition ("electrical_surge", self.origin);
  4658. }
  4659. }
  4660. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement