Advertisement
Guest User

bo1 perk script

a guest
Jun 8th, 2018
1,003
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 49.60 KB | None | 0 0
  1. #include maps\_utility;
  2. #include common_scripts\utility;
  3. #include maps\_zombiemode_utility;
  4.  
  5. //*******************************************************************************\\
  6. /*
  7. MODIFIED PERKS SCRIPT FOR ZOMBIES
  8.  
  9. Author: F3ARxReaper666 (death_reaper0 on UGX/fourms)
  10.  
  11. CHANGES/ADDITIONS:
  12. changes functions to allow perks to be customized with 1 line each
  13. ability to add custom perks easily
  14. automatically detects any perks in the map ran (no need to add level variables)
  15. customisable perk slots per player (default 4)
  16. -level.perk_limit = 4; -base perk slot limit
  17. -to add a perk slot for 1 player, call maps\_zombiemode_perks::give_perk_slot(); on a player
  18. -to change base perk limit see line 28
  19.  
  20. see line 81 for how to add aditional perks
  21.  
  22. */
  23. //*******************************************************************************\\
  24.  
  25. init()
  26. {
  27. place_additionalprimaryweapon_machine();
  28. level.perk_limit = 4; //change to be perk limit for all players
  29. PrecacheItem( "zombie_knuckle_crack" );
  30. level.zombiemode_divetonuke_perk_func = ::divetonuke_explode;
  31. level._effect["divetonuke_groundhit"] = loadfx("maps/zombie/fx_zmb_phdflopper_exp");
  32. set_zombie_var( "zombie_perk_divetonuke_radius", 300 ); // WW (01/12/2011): Issue 74726:DLC 2 - Zombies - Cosmodrome - PHD Flopper - Increase the radius on the explosion (Old: 150)
  33. set_zombie_var( "zombie_perk_divetonuke_min_damage", 1000 );
  34. set_zombie_var( "zombie_perk_divetonuke_max_damage", 5000 );
  35. PrecacheModel("zombie_vending_packapunch_on");
  36. level._effect["doubletap_light"] = loadfx("misc/fx_zombie_cola_dtap_on");
  37. level._effect["marathon_light"] = loadfx("maps/zombie/fx_zmb_cola_staminup_on");
  38. level._effect["divetonuke_light"] = loadfx("misc/fx_zombie_cola_dtap_on");
  39. level._effect["deadshot_light"] = loadfx("misc/fx_zombie_cola_dtap_on");
  40. level._effect["additionalprimaryweapon_light"] = loadfx("misc/fx_zombie_cola_arsenal_on");
  41. level._effect["jugger_light"] = loadfx("misc/fx_zombie_cola_jugg_on");
  42. level._effect["revive_light"] = loadfx("misc/fx_zombie_cola_revive_on");
  43. level._effect["sleight_light"] = loadfx("misc/fx_zombie_cola_on");
  44. level._effect["packapunch_fx"] = loadfx("maps/zombie/fx_zombie_packapunch");
  45. level._effect["revive_light_flicker"] = loadfx("maps/zombie/fx_zmb_cola_revive_flicker");
  46. PrecacheString( &"ZOMBIE_PERK_PACKAPUNCH" );
  47.  
  48. // Perks-a-cola vending machine use triggers
  49. vending_triggers = GetEntArray( "zombie_vending", "targetname" );
  50.  
  51. // Pack-A-Punch weapon upgrade machine use triggers
  52. vending_weapon_upgrade_trigger = GetEntArray("zombie_vending_upgrade", "targetname");
  53. flag_init("pack_machine_in_use");
  54. flag_init( "solo_game" );
  55.  
  56. if( level.mutators["mutator_noPerks"] )
  57. {
  58. for( i = 0; i < vending_triggers.size; i++ )
  59. {
  60. vending_triggers[i] disable_trigger();
  61. }
  62. for( i = 0; i < vending_weapon_upgrade_trigger.size; i++ )
  63. {
  64. vending_weapon_upgrade_trigger[i] disable_trigger();
  65. }
  66. return;
  67. }
  68.  
  69. if ( vending_triggers.size < 1 )
  70. {
  71. return;
  72. }
  73.  
  74. if ( vending_weapon_upgrade_trigger.size >= 1 )
  75. {
  76. array_thread( vending_weapon_upgrade_trigger, ::vending_weapon_upgrade );;
  77. }
  78.  
  79. //*******************************************************************************\\
  80. /*
  81. all items, materials and models WILL be precached from this, no need to do it above. only fx will not be
  82.  
  83. add_perk( vending_machine, specialty, light_fx, machine_change, cost, perk_name, perk_name_actual, shader, bottle_weapon, short_jingle, function);
  84. vending_machine - targetname on machine
  85. specialty - trigger specialty (script_noteworthy)
  86. light_fx - name of fx used for machine (level._effect[ -> light_fx <- ]) e.g. "zombie_vending_jugg_on"
  87. machine_change - name of model to change to when powers on (CAN leave undefined if none)
  88. cost - cost of the perk (should be a whole number e.g. 2500 )
  89. perk_name - string of perks name e.g. "Deadshot Daquari" (leave undefined if string is already made e.g. &"ZOMBIE_PERK_JUGGERNAUT")
  90. perk_name_actual - use this if above is undefined ONLY! should be used if string exists e.g. "ZOMBIE_PERK_JUGGERNAUT"
  91. shader - name of icon to show up in game e.g. "specialty_juggernaut_zombies"
  92. bottle_weapon - name of bottle used when drinking e.g. "zombie_perk_bottle_jugg"
  93. short_jingle - name of jingle to play upon purchase e.g. "mx_jugger_sting"
  94. function - threaded fuction that will only play if perk exists e.g. ::my_fuction
  95.  
  96. add_custom_perk( vending_machine, specialty, light_fx, machine_change, cost, perk_name, perk_name_actual, shader, bottle_weapon, short_jingle, function);
  97. -same as everything above, but WILL NOT need a specific specialty, instead saves to an array on player
  98. -for these perks, you will need different checks for if the player has it (listed below)
  99.  
  100. HasPerk( specialty_NAME ) -|- will become -|- maps\_zombiemode_perks::HasCustomPerk( specialty_NAME )
  101. UnsetPerk( specialty_NAME ) -|- will become -|- maps\_zombiemode_perks::UnsetCustomPerk( specialty_NAME )
  102. SetPerk( specialty_NAME ) -|- will become -|- maps\_zombiemode_perks::SetCustomPerk( specialty_NAME )
  103.  
  104. extra fuctions for custom specialty perks
  105. maps\_zombiemode_perks::IsCustomPerk( specialty_NAME ) - returns true if specialty is listed as a custom specialty
  106. maps\_zombiemode_perks::CreateCustomPerk( specialty_NAME ) - shouldnt be needed, but this will create a custom specialty (add_custom_perk() will automaticly use this)
  107. maps\_zombiemode_perks::HasThePerk( specialty_NAME ) - finds out if player has that perk as custom or normal (it will find out if its custom or normal for you)
  108. */
  109. //*******************************************************************************\\
  110.  
  111.  
  112. // vending_machine, specialty, light_fx, machine_change, cost, perk_name, perk_name_actual, shader, bottle_weapon, short_jingle, function
  113. level thread add_perk("vending_jugg", "specialty_armorvest", "jugger_light", "zombie_vending_jugg_on", 2500, undefined, &"ZOMBIE_PERK_JUGGERNAUT", "specialty_juggernaut_zombies", "zombie_perk_bottle_jugg", "mx_jugger_sting", undefined);
  114. level thread add_perk("vending_sleight", "specialty_fastreload", "sleight_light", "zombie_vending_sleight_on", 3000, undefined, &"ZOMBIE_PERK_FASTRELOAD", "specialty_fastreload_zombies", "zombie_perk_bottle_sleight", "mx_speed_sting", undefined);
  115. level thread add_perk("vending_doubletap", "specialty_rof", "doubletap_light", "zombie_vending_doubletap_on", 2000, undefined, &"ZOMBIE_PERK_DOUBLETAP", "specialty_doubletap_zombies", "zombie_perk_bottle_doubletap", "mx_doubletap_sting", undefined);
  116. level thread add_perk("vending_revive", "specialty_quickrevive", "revive_light", "zombie_vending_revive_on", 1500, undefined, &"ZOMBIE_PERK_QUICKREVIVE", "specialty_quickrevive_zombies", "zombie_perk_bottle_revive", "mx_revive_sting", undefined);
  117.  
  118. level thread add_perk("vending_divetonuke", "specialty_flakjacket", "divetonuke_light", "zombie_vending_nuke_on", 2000, "PHD Flopper", undefined, "specialty_divetonuke_zombies", "zombie_perk_bottle_nuke", undefined, undefined);
  119. level thread add_perk("vending_marathon", "specialty_longersprint", "marathon_light", "zombie_vending_marathon_on", 2000, "Stamin-Up", undefined, "specialty_marathon_zombies", "zombie_perk_bottle_marathon", undefined, undefined);
  120. level thread add_perk("vending_deadshot", "specialty_deadshot", "deadshot_light", "zombie_vending_ads_on", 1000, "Deadshot Daquari", undefined, "specialty_ads_zombies", "zombie_perk_bottle_deadshot", undefined, undefined);
  121. level thread add_perk("vending_additionalprimaryweapon", "specialty_additionalprimaryweapon", "additionalprimaryweapon_light", "zombie_vending_three_gun_on", 4000, "Mule Kick", undefined, "specialty_extraprimaryweapon_zombies", "zombie_perk_bottle_additionalprimaryweapon", undefined, undefined);
  122.  
  123. level thread add_custom_perk("vending_bulletdamage", "specialty_bulletdamage", "revive_light", undefined, 3000, "Tufbrew", undefined, "specialty_tufbrew_zombies", "zombie_perk_bottle_doubletap", undefined, undefined);
  124. level thread add_custom_perk("vending_bulletaccuracy", "specialty_bulletaccuracy", "sleight_light", undefined, 2500, "Candolier Soda", undefined, "specialty_candolier_zombies", "zombie_perk_bottle_sleight", undefined, undefined);
  125.  
  126.  
  127. //custom perk fuctions
  128. maps\_zombiemode_spawner::register_zombie_damage_callback(::tufbrew_func);//tufbrew perk, double damage on bullet guns
  129. //level thread candolier(); //bandolier perk, 2 extra clips of ammo for each gun, add to weapon files of each gun
  130.  
  131.  
  132.  
  133. //Perks machine
  134. if( !isDefined( level.packapunch_timeout ) )
  135. {
  136. level.packapunch_timeout = 15;
  137. }
  138.  
  139. set_zombie_var( "zombie_perk_cost", 2000 );
  140. if( level.mutators["mutator_susceptible"] )
  141. {
  142. set_zombie_var( "zombie_perk_juggernaut_health", 80 );
  143. set_zombie_var( "zombie_perk_juggernaut_health_upgrade", 95 );
  144. }
  145. else
  146. {
  147. set_zombie_var( "zombie_perk_juggernaut_health", 160 );
  148. set_zombie_var( "zombie_perk_juggernaut_health_upgrade", 190 );
  149. }
  150.  
  151. array_thread( vending_triggers, ::vending_trigger_think );
  152. array_thread( vending_triggers, ::electric_perks_dialog );
  153.  
  154. level thread turn_PackAPunch_on();
  155. level thread perk_slot_setup();
  156.  
  157. if ( isdefined( level.quantum_bomb_register_result_func ) )
  158. {
  159. [[level.quantum_bomb_register_result_func]]( "give_nearest_perk", ::quantum_bomb_give_nearest_perk_result, 10, ::quantum_bomb_give_nearest_perk_validation );
  160. }
  161. }
  162.  
  163.  
  164. place_additionalprimaryweapon_machine()
  165. {
  166. if ( !isdefined( level.zombie_additionalprimaryweapon_machine_origin ) )
  167. {
  168. return;
  169. }
  170.  
  171. machine = Spawn( "script_model", level.zombie_additionalprimaryweapon_machine_origin );
  172. machine.angles = level.zombie_additionalprimaryweapon_machine_angles;
  173. machine setModel( "zombie_vending_three_gun" );
  174. machine.targetname = "vending_additionalprimaryweapon";
  175.  
  176. machine_trigger = Spawn( "trigger_radius_use", level.zombie_additionalprimaryweapon_machine_origin + (0, 0, 30), 0, 20, 70 );
  177. machine_trigger.targetname = "zombie_vending";
  178. machine_trigger.target = "vending_additionalprimaryweapon";
  179. machine_trigger.script_noteworthy = "specialty_additionalprimaryweapon";
  180.  
  181. if ( isdefined( level.zombie_additionalprimaryweapon_machine_clip_origin ) )
  182. {
  183. machine_clip = spawn( "script_model", level.zombie_additionalprimaryweapon_machine_clip_origin );
  184. machine_clip.angles = level.zombie_additionalprimaryweapon_machine_clip_angles;
  185. machine_clip setmodel( "collision_geo_64x64x256" );
  186. machine_clip Hide();
  187. }
  188.  
  189. if ( isdefined( level.zombie_additionalprimaryweapon_machine_monkey_origins ) )
  190. {
  191. machine.target = "vending_additionalprimaryweapon_monkey_structs";
  192. for ( i = 0; i < level.zombie_additionalprimaryweapon_machine_monkey_origins.size; i++ )
  193. {
  194. machine_monkey_struct = SpawnStruct();
  195. machine_monkey_struct.origin = level.zombie_additionalprimaryweapon_machine_monkey_origins[i];
  196. machine_monkey_struct.angles = level.zombie_additionalprimaryweapon_machine_monkey_angles;
  197. machine_monkey_struct.script_int = i + 1;
  198. machine_monkey_struct.script_notetworthy = "cosmo_monkey_additionalprimaryweapon";
  199. machine_monkey_struct.targetname = "vending_additionalprimaryweapon_monkey_structs";
  200.  
  201. if ( !IsDefined( level.struct_class_names["targetname"][machine_monkey_struct.targetname] ) )
  202. {
  203. level.struct_class_names["targetname"][machine_monkey_struct.targetname] = [];
  204. }
  205.  
  206. size = level.struct_class_names["targetname"][machine_monkey_struct.targetname].size;
  207. level.struct_class_names["targetname"][machine_monkey_struct.targetname][size] = machine_monkey_struct;
  208. }
  209. }
  210.  
  211. level.zombiemode_using_additionalprimaryweapon_perk = true;
  212. }
  213.  
  214. HasThePerk( perk )
  215. {
  216. p = false;
  217. if(IsCustomPerk(perk))
  218. if(self HasCustomPerk( perk ))
  219. p = true;
  220. else
  221. if(self HasPerk( perk ))
  222. p = true;
  223. return p;
  224. }
  225.  
  226. CreateCustomPerk( specialty )
  227. {
  228. if(!isdefined(level.custom_perk_array))
  229. level.custom_perk_array = [];
  230. level.custom_perk_array[specialty] = true;
  231. }
  232.  
  233. IsCustomPerk( specialty )
  234. {
  235. if(isdefined(level.custom_perk_array))
  236. // for ( i = 0; i < level.custom_perk_array.size; i++ )
  237. if(isdefined(level.custom_perk_array[specialty]) && level.custom_perk_array[specialty] == true)
  238. return true;
  239. return false;
  240. }
  241.  
  242. HasCustomPerk( specialty )
  243. {
  244. if(!isdefined(self.custom_perk_array))
  245. self.custom_perk_array = [];
  246. if(isdefined(self.custom_perk_array))
  247. // for ( i = 0; i < self.custom_perk_array.size; i++ )
  248. if(isdefined(self.custom_perk_array[specialty]) && self.custom_perk_array[specialty] == true)
  249. return true;
  250. return false;
  251. }
  252.  
  253. SetCustomPerk( specialty )
  254. {
  255. if(!isdefined(self.custom_perk_array))
  256. self.custom_perk_array = [];
  257. self.custom_perk_array[specialty] = true;
  258. }
  259.  
  260. UnsetCustomPerk( specialty )
  261. {
  262. if(!isdefined(self.custom_perk_array))
  263. self.custom_perk_array = [];
  264. self.custom_perk_array[specialty] = undefined;
  265. }
  266.  
  267. add_custom_perk(vending_machine, specialty, light_fx, machine_change, cost, perk_name, perk_name_actual, shader, bottle_weapon, sound, function)
  268. {
  269. CreateCustomPerk( specialty );
  270. level thread add_perk(vending_machine, specialty, light_fx, machine_change, cost, perk_name, perk_name_actual, shader, bottle_weapon, sound, function);
  271. }
  272.  
  273. add_perk(vending_machine, specialty, light_fx, machine_change, cost, perk_name, perk_name_actual, shader, bottle_weapon, sound, function)
  274. {
  275. if (!isdefined(level.zombie_perks))
  276. level.zombie_perks = [];
  277. if (!isdefined(level.perk_total))
  278. level.perk_total =0;
  279. //make sure the map uses this perk
  280. perk_exists = false;
  281. vending_triggers = GetEntArray( "zombie_vending", "targetname" );
  282. for ( i = 0; i < vending_triggers.size; i++ )
  283. {
  284. perk = vending_triggers[i].script_noteworthy;
  285. if (perk == specialty)
  286. perk_exists = true;
  287. }
  288. if (!perk_exists) return;
  289. level.perk_total +=1;
  290. if(isDefined(machine_change))
  291. PrecacheModel(machine_change);
  292. if(isDefined(bottle_weapon))
  293. PrecacheItem(bottle_weapon);
  294. level thread turn_perk_on(vending_machine, specialty, light_fx, machine_change);
  295. perk = SpawnStruct();
  296. if(isDefined(perk_name_actual))
  297. {
  298. PrecacheString( perk_name_actual );
  299. perk.perk_name_actual = perk_name_actual;
  300. }
  301. else
  302. perk.perk_name = perk_name;
  303. perk.cost = cost;
  304. perk.bottle_weapon = bottle_weapon;
  305. PrecacheShader( shader );
  306. perk.shader = shader;
  307. if (isDefined(sound))
  308. perk.sound = sound;
  309. level.zombie_perks[specialty] = perk;
  310. if (isDefined(function))
  311. level thread [[function]]();
  312. }
  313.  
  314. third_person_weapon_upgrade( current_weapon, origin, angles, packa_rollers, perk_machine )
  315. {
  316. forward = anglesToForward( angles );
  317. interact_pos = origin + (forward*-25);
  318. PlayFx( level._effect["packapunch_fx"], origin+(0,1,-34), forward );
  319.  
  320. worldgun = spawn( "script_model", interact_pos );
  321. worldgun.angles = self.angles;
  322. worldgun setModel( GetWeaponModel( current_weapon ) );
  323. worldgun useweaponhidetags( current_weapon );
  324. worldgun rotateto( angles+(0,90,0), 0.35, 0, 0 );
  325.  
  326. offsetdw = ( 3, 3, 3 );
  327. worldgundw = undefined;
  328. if ( maps\_zombiemode_weapons::weapon_is_dual_wield( current_weapon ) )
  329. {
  330. worldgundw = spawn( "script_model", interact_pos + offsetdw );
  331. worldgundw.angles = self.angles;
  332.  
  333. worldgundw setModel( maps\_zombiemode_weapons::get_left_hand_weapon_model_name( current_weapon ) );
  334. worldgundw useweaponhidetags( current_weapon );
  335. worldgundw rotateto( angles+(0,90,0), 0.35, 0, 0 );
  336. }
  337.  
  338. wait( 0.5 );
  339.  
  340. worldgun moveto( origin, 0.5, 0, 0 );
  341. if ( isdefined( worldgundw ) )
  342. {
  343. worldgundw moveto( origin + offsetdw, 0.5, 0, 0 );
  344. }
  345.  
  346. self playsound( "zmb_perks_packa_upgrade" );
  347. if( isDefined( perk_machine.wait_flag ) )
  348. {
  349. perk_machine.wait_flag rotateto( perk_machine.wait_flag.angles+(179, 0, 0), 0.25, 0, 0 );
  350. }
  351. wait( 0.35 );
  352.  
  353. worldgun delete();
  354. if ( isdefined( worldgundw ) )
  355. {
  356. worldgundw delete();
  357. }
  358.  
  359. wait( 3 );
  360.  
  361. self playsound( "zmb_perks_packa_ready" );
  362.  
  363. worldgun = spawn( "script_model", origin );
  364. worldgun.angles = angles+(0,90,0);
  365. worldgun setModel( GetWeaponModel( level.zombie_weapons[current_weapon].upgrade_name ) );
  366. worldgun useweaponhidetags( level.zombie_weapons[current_weapon].upgrade_name );
  367. worldgun moveto( interact_pos, 0.5, 0, 0 );
  368.  
  369. worldgundw = undefined;
  370. if ( maps\_zombiemode_weapons::weapon_is_dual_wield( level.zombie_weapons[current_weapon].upgrade_name ) )
  371. {
  372. worldgundw = spawn( "script_model", origin + offsetdw );
  373. worldgundw.angles = angles+(0,90,0);
  374.  
  375. worldgundw setModel( maps\_zombiemode_weapons::get_left_hand_weapon_model_name( level.zombie_weapons[current_weapon].upgrade_name ) );
  376. worldgundw useweaponhidetags( level.zombie_weapons[current_weapon].upgrade_name );
  377. worldgundw moveto( interact_pos + offsetdw, 0.5, 0, 0 );
  378. }
  379.  
  380. if( isDefined( perk_machine.wait_flag ) )
  381. {
  382. perk_machine.wait_flag rotateto( perk_machine.wait_flag.angles-(179, 0, 0), 0.25, 0, 0 );
  383. }
  384.  
  385. wait( 0.5 );
  386.  
  387. worldgun moveto( origin, level.packapunch_timeout, 0, 0);
  388. if ( isdefined( worldgundw ) )
  389. {
  390. worldgundw moveto( origin + offsetdw, level.packapunch_timeout, 0, 0);
  391. }
  392.  
  393. worldgun.worldgundw = worldgundw;
  394. return worldgun;
  395. }
  396.  
  397.  
  398. vending_machine_trigger_think()
  399. {
  400. self endon("death");
  401.  
  402. while(1)
  403. {
  404. players = get_players();
  405.  
  406. for(i = 0; i < players.size; i ++)
  407. {
  408. if ( players[i] hacker_active() )
  409. {
  410. self SetInvisibleToPlayer( players[i], true );
  411. }
  412. else
  413. {
  414. self SetInvisibleToPlayer( players[i], false );
  415. }
  416. }
  417. wait(0.1);
  418. }
  419. }
  420.  
  421. //
  422. // Pack-A-Punch Weapon Upgrade
  423. //
  424. vending_weapon_upgrade()
  425. {
  426. perk_machine = GetEnt( self.target, "targetname" );
  427. perk_machine_sound = GetEntarray ( "perksacola", "targetname");
  428. packa_rollers = spawn("script_origin", self.origin);
  429. packa_timer = spawn("script_origin", self.origin);
  430. packa_rollers LinkTo( self );
  431. packa_timer LinkTo( self );
  432.  
  433. if( isDefined( perk_machine.target ) )
  434. {
  435. perk_machine.wait_flag = GetEnt( perk_machine.target, "targetname" );
  436. }
  437.  
  438. self UseTriggerRequireLookAt();
  439. self SetHintString( &"ZOMBIE_NEED_POWER" );
  440. self SetCursorHint( "HINT_NOICON" );
  441.  
  442. level waittill("Pack_A_Punch_on");
  443.  
  444. self thread vending_machine_trigger_think();
  445.  
  446. self thread maps\_zombiemode_weapons::decide_hide_show_hint();
  447.  
  448. perk_machine playloopsound("zmb_perks_packa_loop");
  449.  
  450. self thread vending_weapon_upgrade_cost();
  451.  
  452. for( ;; )
  453. {
  454. self waittill( "trigger", player );
  455.  
  456. index = maps\_zombiemode_weapons::get_player_index(player);
  457. plr = "zmb_vox_plr_" + index + "_";
  458. current_weapon = player getCurrentWeapon();
  459.  
  460. if ( "microwavegun_zm" == current_weapon )
  461. {
  462. current_weapon = "microwavegundw_zm";
  463. }
  464.  
  465. if( !player maps\_zombiemode_weapons::can_buy_weapon() ||
  466. player maps\_laststand::player_is_in_laststand() ||
  467. is_true( player.intermission ) ||
  468. player isThrowingGrenade() ||
  469. player maps\_zombiemode_weapons::is_weapon_upgraded( current_weapon ) )
  470. {
  471. wait( 0.1 );
  472. continue;
  473. }
  474.  
  475. if( is_true(level.pap_moving)) //can't use the pap machine while it's being lowered or raised
  476. {
  477. continue;
  478. }
  479.  
  480. if( player isSwitchingWeapons() )
  481. {
  482. wait(0.1);
  483. continue;
  484. }
  485.  
  486. if ( !IsDefined( level.zombie_include_weapons[current_weapon] ) )
  487. {
  488. continue;
  489. }
  490.  
  491. if ( player.score < self.cost )
  492. {
  493. //player iprintln( "Not enough points to buy Perk: " + perk );
  494. self playsound("deny");
  495. player maps\_zombiemode_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 );
  496. continue;
  497. }
  498.  
  499. flag_set("pack_machine_in_use");
  500.  
  501. player maps\_zombiemode_score::minus_to_player_score( self.cost );
  502. sound = "evt_bottle_dispense";
  503. playsoundatposition(sound, self.origin);
  504.  
  505. //TUEY TODO: Move this to a general init string for perk audio later on
  506. self thread maps\_zombiemode_audio::play_jingle_or_stinger("mus_perks_packa_sting");
  507. player maps\_zombiemode_audio::create_and_play_dialog( "weapon_pickup", "upgrade_wait" );
  508.  
  509. origin = self.origin;
  510. angles = self.angles;
  511.  
  512. if( isDefined(perk_machine))
  513. {
  514. origin = perk_machine.origin+(0,0,35);
  515. angles = perk_machine.angles+(0,90,0);
  516. }
  517.  
  518. self disable_trigger();
  519.  
  520. player thread do_knuckle_crack();
  521.  
  522. // Remember what weapon we have. This is needed to check unique weapon counts.
  523. self.current_weapon = current_weapon;
  524.  
  525. weaponmodel = player third_person_weapon_upgrade( current_weapon, origin, angles, packa_rollers, perk_machine );
  526.  
  527. self enable_trigger();
  528. self SetHintString( &"ZOMBIE_GET_UPGRADED" );
  529. self setvisibletoplayer( player );
  530.  
  531. self thread wait_for_player_to_take( player, current_weapon, packa_timer );
  532. self thread wait_for_timeout( current_weapon, packa_timer );
  533.  
  534. self waittill_either( "pap_timeout", "pap_taken" );
  535.  
  536. self.current_weapon = "";
  537. if ( isdefined( weaponmodel.worldgundw ) )
  538. {
  539. weaponmodel.worldgundw delete();
  540. }
  541. weaponmodel delete();
  542. self SetHintString( &"ZOMBIE_PERK_PACKAPUNCH", self.cost );
  543. self setvisibletoall();
  544. flag_clear("pack_machine_in_use");
  545.  
  546. }
  547. }
  548.  
  549.  
  550. vending_weapon_upgrade_cost()
  551. {
  552. while ( 1 )
  553. {
  554. self.cost = 5000;
  555. self SetHintString( &"ZOMBIE_PERK_PACKAPUNCH", self.cost );
  556.  
  557. level waittill( "powerup bonfire sale" );
  558.  
  559. self.cost = 1000;
  560. self SetHintString( &"ZOMBIE_PERK_PACKAPUNCH", self.cost );
  561.  
  562. level waittill( "bonfire_sale_off" );
  563. }
  564. }
  565.  
  566.  
  567. //
  568. //
  569. wait_for_player_to_take( player, weapon, packa_timer )
  570. {
  571. AssertEx( IsDefined( level.zombie_weapons[weapon] ), "wait_for_player_to_take: weapon does not exist" );
  572. AssertEx( IsDefined( level.zombie_weapons[weapon].upgrade_name ), "wait_for_player_to_take: upgrade_weapon does not exist" );
  573.  
  574. upgrade_weapon = level.zombie_weapons[weapon].upgrade_name;
  575.  
  576. self endon( "pap_timeout" );
  577. while( true )
  578. {
  579. packa_timer playloopsound( "zmb_perks_packa_ticktock" );
  580. self waittill( "trigger", trigger_player );
  581. packa_timer stoploopsound(.05);
  582. if( trigger_player == player )
  583. {
  584. current_weapon = player GetCurrentWeapon();
  585. /#
  586. if ( "none" == current_weapon )
  587. {
  588. iprintlnbold( "WEAPON IS NONE, PACKAPUNCH RETRIEVAL DENIED" );
  589. }
  590. #/
  591. if( is_player_valid( player ) && !player is_drinking() && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && "syrette_sp" != current_weapon && "none" != current_weapon && !player hacker_active())
  592. {
  593. self notify( "pap_taken" );
  594. player notify( "pap_taken" );
  595. player.pap_used = true;
  596.  
  597. weapon_limit = 2;
  598. if ( player HasThePerk( "specialty_additionalprimaryweapon" ) )
  599. {
  600. weapon_limit = 3;
  601. }
  602.  
  603. primaries = player GetWeaponsListPrimaries();
  604. if( isDefined( primaries ) && primaries.size >= weapon_limit )
  605. {
  606. player maps\_zombiemode_weapons::weapon_give( upgrade_weapon );
  607. }
  608. else
  609. {
  610. player GiveWeapon( upgrade_weapon, 0, player maps\_zombiemode_weapons::get_pack_a_punch_weapon_options( upgrade_weapon ) );
  611. player GiveStartAmmo( upgrade_weapon );
  612. }
  613.  
  614. player SwitchToWeapon( upgrade_weapon );
  615. player maps\_zombiemode_weapons::play_weapon_vo(upgrade_weapon);
  616. return;
  617. }
  618. }
  619. wait( 0.05 );
  620. }
  621. }
  622.  
  623.  
  624. // Waiting for the weapon to be taken
  625. //
  626. wait_for_timeout( weapon, packa_timer )
  627. {
  628. self endon( "pap_taken" );
  629.  
  630. wait( level.packapunch_timeout );
  631.  
  632. self notify( "pap_timeout" );
  633. packa_timer stoploopsound(.05);
  634. packa_timer playsound( "zmb_perks_packa_deny" );
  635.  
  636. maps\_zombiemode_weapons::unacquire_weapon_toggle( weapon );
  637. }
  638.  
  639.  
  640. // Weapon has been inserted, crack knuckles while waiting
  641. //
  642. do_knuckle_crack()
  643. {
  644. gun = self upgrade_knuckle_crack_begin();
  645.  
  646. self waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" );
  647.  
  648. self upgrade_knuckle_crack_end( gun );
  649.  
  650. }
  651.  
  652.  
  653. // Switch to the knuckles
  654. //
  655. upgrade_knuckle_crack_begin()
  656. {
  657. self increment_is_drinking();
  658.  
  659. self AllowLean( false );
  660. self AllowAds( false );
  661. self AllowSprint( false );
  662. self AllowCrouch( true );
  663. self AllowProne( false );
  664. self AllowMelee( false );
  665.  
  666. if ( self GetStance() == "prone" )
  667. {
  668. self SetStance( "crouch" );
  669. }
  670.  
  671. primaries = self GetWeaponsListPrimaries();
  672.  
  673. gun = self GetCurrentWeapon();
  674. weapon = "zombie_knuckle_crack";
  675.  
  676. if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) )
  677. {
  678. self notify( "zmb_lost_knife" );
  679. self TakeWeapon( gun );
  680. }
  681. else
  682. {
  683. return;
  684. }
  685.  
  686. self GiveWeapon( weapon );
  687. self SwitchToWeapon( weapon );
  688.  
  689. return gun;
  690. }
  691.  
  692. // Anim has ended, now switch back to something
  693. //
  694. upgrade_knuckle_crack_end( gun )
  695. {
  696. assert( gun != "zombie_perk_bottle_doubletap" );
  697. assert( gun != "zombie_perk_bottle_jugg" );
  698. assert( gun != "zombie_perk_bottle_revive" );
  699. assert( gun != "zombie_perk_bottle_sleight" );
  700. assert( gun != "zombie_perk_bottle_marathon" );
  701. assert( gun != "zombie_perk_bottle_nuke" );
  702. assert( gun != "zombie_perk_bottle_deadshot" );
  703. assert( gun != "zombie_perk_bottle_additionalprimaryweapon" );
  704. assert( gun != "syrette_sp" );
  705.  
  706. self AllowLean( true );
  707. self AllowAds( true );
  708. self AllowSprint( true );
  709. self AllowProne( true );
  710. self AllowMelee( true );
  711. weapon = "zombie_knuckle_crack";
  712.  
  713. // TODO: race condition?
  714. if ( self maps\_laststand::player_is_in_laststand() || is_true( self.intermission ) )
  715. {
  716. self TakeWeapon(weapon);
  717. return;
  718. }
  719.  
  720. self decrement_is_drinking();
  721.  
  722. self TakeWeapon(weapon);
  723. primaries = self GetWeaponsListPrimaries();
  724. if( self is_drinking() )
  725. {
  726. return;
  727. }
  728. else if( isDefined( primaries ) && primaries.size > 0 )
  729. {
  730. self SwitchToWeapon( primaries[0] );
  731. }
  732. else
  733. {
  734. self SwitchToWeapon( level.laststandpistol );
  735. }
  736. }
  737.  
  738. // PI_CHANGE_BEGIN
  739. // NOTE: In the .map, you'll have to make sure that each Pack-A-Punch machine has a unique targetname
  740. turn_PackAPunch_on()
  741. {
  742. level waittill("Pack_A_Punch_on");
  743.  
  744. vending_weapon_upgrade_trigger = GetEntArray("zombie_vending_upgrade", "targetname");
  745. for(i=0; i<vending_weapon_upgrade_trigger.size; i++ )
  746. {
  747. perk = getent(vending_weapon_upgrade_trigger[i].target, "targetname");
  748. if(isDefined(perk))
  749. {
  750. perk thread activate_PackAPunch();
  751. }
  752. }
  753. }
  754.  
  755. activate_PackAPunch()
  756. {
  757. self setmodel("zombie_vending_packapunch_on");
  758. self playsound("zmb_perks_power_on");
  759. self vibrate((0,-100,0), 0.3, 0.4, 3);
  760. /*
  761. self.flag = spawn( "script_model", machine GetTagOrigin( "tag_flag" ) );
  762. self.angles = machine GetTagAngles( "tag_flag" );
  763. self.flag setModel( "zombie_sign_please_wait" );
  764. self.flag linkto( machine );
  765. self.flag.origin = (0, 40, 40);
  766. self.flag.angles = (0, 0, 0);
  767. */
  768. timer = 0;
  769. duration = 0.05;
  770.  
  771. level notify( "Carpenter_On" );
  772. }
  773. // PI_CHANGE_END
  774.  
  775.  
  776.  
  777. //############################################################################
  778. // P E R K M A C H I N E S
  779. //############################################################################
  780.  
  781. //
  782. // Threads to turn the machines to their ON state.
  783. //
  784.  
  785. turn_perk_on(vending_machine, specialty, light_fx, machine_change)
  786. {
  787. machine = getentarray(vending_machine, "targetname");
  788. flag_wait( "all_players_connected" );
  789. players = get_players();
  790. if(players.size == 1 && specialty == "specialty_quickrevive")
  791. {
  792. machine_model = undefined;
  793. machine_clip = undefined;
  794. for( i = 0; i < machine.size; i++ )
  795. {
  796. if(IsDefined(machine[i].script_noteworthy) && machine[i].script_noteworthy == "clip")
  797. {
  798. machine_clip = machine[i];
  799. }
  800. else // then the model
  801. {
  802. machine[i] setmodel("zombie_vending_revive_on");
  803. machine_model = machine[i];
  804. }
  805. }
  806. wait_network_frame();
  807. if ( isdefined( machine_model ) )
  808. {
  809. machine_model thread revive_solo_fx(machine_clip);
  810. }
  811. }
  812. else
  813. level waittill_any("electricity_on", "juggernog_on", specialty+"_on");
  814. for( i = 0; i < machine.size; i++ )
  815. {
  816. if(isdefined(machine[i]))
  817. {
  818. if(isdefined(machine_change))
  819. machine[i] setmodel(machine_change);
  820. machine[i] vibrate((0,-100,0), 0.3, 0.4, 3);
  821. machine[i] playsound("zmb_perks_power_on");
  822. machine[i] thread perk_fx( light_fx );
  823. }
  824. }
  825. level notify( specialty + "_power_on" );
  826. }
  827.  
  828. revive_solo_fx(machine_clip)
  829. {
  830. flag_init( "solo_revive" );
  831.  
  832. self.fx = Spawn( "script_model", self.origin );
  833. self.fx.angles = self.angles;
  834. self.fx SetModel( "tag_origin" );
  835. self.fx LinkTo(self);
  836.  
  837. playfxontag( level._effect[ "revive_light" ], self.fx, "tag_origin" );
  838. playfxontag( level._effect[ "revive_light_flicker" ], self.fx, "tag_origin" );
  839.  
  840. flag_wait( "solo_revive" );
  841.  
  842. if ( isdefined( level.revive_solo_fx_func ) )
  843. {
  844. level thread [[ level.revive_solo_fx_func ]]();
  845. }
  846. wait(2.0);
  847. self playsound("zmb_box_move");
  848. playsoundatposition ("zmb_whoosh", self.origin );
  849.  
  850. self moveto(self.origin + (0,0,40),3);
  851. if( isDefined( level.custom_vibrate_func ) )
  852. {
  853. [[ level.custom_vibrate_func ]]( self );
  854. }
  855. else
  856. {
  857. direction = self.origin;
  858. direction = (direction[1], direction[0], 0);
  859.  
  860. if(direction[1] < 0 || (direction[0] > 0 && direction[1] > 0))
  861. {
  862. direction = (direction[0], direction[1] * -1, 0);
  863. }
  864. else if(direction[0] < 0)
  865. {
  866. direction = (direction[0] * -1, direction[1], 0);
  867. }
  868.  
  869. self Vibrate( direction, 10, 0.5, 5);
  870. }
  871.  
  872. self waittill("movedone");
  873. PlayFX(level._effect["poltergeist"], self.origin);
  874. playsoundatposition ("zmb_box_poof", self.origin);
  875.  
  876. level clientNotify( "drb" );
  877.  
  878. //self setmodel("zombie_vending_revive");
  879. self.fx Unlink();
  880. self.fx delete();
  881. self Delete();
  882.  
  883. // DCS: remove the clip.
  884. machine_clip trigger_off();
  885. machine_clip ConnectPaths();
  886. machine_clip Delete();
  887. }
  888.  
  889. divetonuke_explode( attacker, origin )
  890. {
  891. // tweakable vars
  892. radius = level.zombie_vars["zombie_perk_divetonuke_radius"];
  893. min_damage = level.zombie_vars["zombie_perk_divetonuke_min_damage"];
  894. max_damage = level.zombie_vars["zombie_perk_divetonuke_max_damage"];
  895.  
  896. // radius damage
  897. RadiusDamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" );
  898.  
  899. // play fx
  900. PlayFx( level._effect["divetonuke_groundhit"], origin );
  901.  
  902. // play sound
  903. attacker playsound("zmb_phdflop_explo");
  904.  
  905. // WW (01/12/11): start clientsided effects - These client flags are defined in _zombiemode.gsc & _zombiemode.csc
  906. // Used for zombie_dive2nuke_visionset() in _zombiemode.csc
  907. attacker SetClientFlag( level._ZOMBIE_PLAYER_FLAG_DIVE2NUKE_VISION );
  908. wait_network_frame();
  909. wait_network_frame();
  910. attacker ClearClientFlag( level._ZOMBIE_PLAYER_FLAG_DIVE2NUKE_VISION );
  911. }
  912. //
  913. //
  914. perk_fx( fx )
  915. {
  916. wait(3);
  917. playfxontag( level._effect[ fx ], self, "tag_origin" );
  918. }
  919.  
  920. electric_perks_dialog()
  921. {
  922. //TODO TEMP Disable Revive in Solo games
  923. flag_wait( "all_players_connected" );
  924. players = GetPlayers();
  925. if ( players.size == 1 )
  926. {
  927. return;
  928. }
  929.  
  930. self endon ("warning_dialog");
  931. level endon("switch_flipped");
  932. timer =0;
  933. while(1)
  934. {
  935. wait(0.5);
  936. players = get_players();
  937. for(i = 0; i < players.size; i++)
  938. {
  939. dist = distancesquared(players[i].origin, self.origin );
  940. if(dist > 70*70)
  941. {
  942. timer = 0;
  943. continue;
  944. }
  945. if(dist < 70*70 && timer < 3)
  946. {
  947. wait(0.5);
  948. timer ++;
  949. }
  950. if(dist < 70*70 && timer == 3)
  951. {
  952.  
  953. players[i] thread do_player_vo("vox_start", 5);
  954. wait(3);
  955. self notify ("warning_dialog");
  956. /#
  957. iprintlnbold("warning_given");
  958. #/
  959. }
  960. }
  961. }
  962. }
  963.  
  964.  
  965. //
  966. //
  967. vending_trigger_think()
  968. {
  969. //self thread turn_cola_off();
  970. perk = self.script_noteworthy;
  971. solo = false;
  972. flag_init( "_start_zm_pistol_rank" );
  973.  
  974. //TODO TEMP Disable Revive in Solo games
  975. if ( IsDefined(perk) &&
  976. (perk == "specialty_quickrevive" || perk == "specialty_quickrevive_upgrade") )
  977. {
  978. flag_wait( "all_players_connected" );
  979. players = GetPlayers();
  980. if ( players.size == 1 )
  981. {
  982. solo = true;
  983. flag_set( "solo_game" );
  984. level.solo_lives_given = 0;
  985. players[0].lives = 0;
  986. level maps\_zombiemode::zombiemode_solo_last_stand_pistol();
  987. }
  988. }
  989.  
  990. flag_set( "_start_zm_pistol_rank" );
  991.  
  992. if ( !solo )
  993. {
  994. self SetHintString( &"ZOMBIE_NEED_POWER" );
  995. }
  996.  
  997. self SetCursorHint( "HINT_NOICON" );
  998. self UseTriggerRequireLookAt();
  999.  
  1000. cost = level.zombie_vars["zombie_perk_cost"];
  1001. cost = level.zombie_perks[perk].cost;
  1002.  
  1003. players = get_players();
  1004. if(players.size == 1 && perk == "specialty_quickrevive")
  1005. cost = 500;
  1006.  
  1007. self.cost = cost;
  1008.  
  1009. if ( !solo )
  1010. {
  1011. notify_name = perk + "_power_on";
  1012. level waittill( notify_name );
  1013. }
  1014.  
  1015. if(!IsDefined(level._perkmachinenetworkchoke))
  1016. {
  1017. level._perkmachinenetworkchoke = 0;
  1018. }
  1019. else
  1020. {
  1021. level._perkmachinenetworkchoke ++;
  1022. }
  1023.  
  1024. for(i = 0; i < level._perkmachinenetworkchoke; i ++)
  1025. {
  1026. wait_network_frame();
  1027. }
  1028.  
  1029. //Turn on music timer
  1030. self thread maps\_zombiemode_audio::perks_a_cola_jingle_timer();
  1031.  
  1032. perk_hum = spawn("script_origin", self.origin);
  1033. perk_hum playloopsound("zmb_perks_machine_loop");
  1034.  
  1035. self thread check_player_has_perk(perk);
  1036.  
  1037. self thread vending_set_hintstring(perk);
  1038.  
  1039. for( ;; )
  1040. {
  1041. self waittill( "trigger", player );
  1042.  
  1043. index = maps\_zombiemode_weapons::get_player_index(player);
  1044.  
  1045. if (player maps\_laststand::player_is_in_laststand() || is_true( player.intermission ) )
  1046. {
  1047. continue;
  1048. }
  1049.  
  1050. if(player in_revive_trigger())
  1051. {
  1052. continue;
  1053. }
  1054.  
  1055. if( player isThrowingGrenade() )
  1056. {
  1057. wait( 0.1 );
  1058. continue;
  1059. }
  1060.  
  1061. if( player isSwitchingWeapons() )
  1062. {
  1063. wait(0.1);
  1064. continue;
  1065. }
  1066.  
  1067. if( player is_drinking() )
  1068. {
  1069. wait( 0.1 );
  1070. continue;
  1071. }
  1072.  
  1073. if ( player HasThePerk( perk ) )
  1074. {
  1075. cheat = false;
  1076.  
  1077. /#
  1078. if ( GetDvarInt( #"zombie_cheat" ) >= 5 )
  1079. {
  1080. cheat = true;
  1081. }
  1082. #/
  1083.  
  1084. if ( cheat != true )
  1085. {
  1086. //player iprintln( "Already using Perk: " + perk );
  1087. self playsound("deny");
  1088. player maps\_zombiemode_audio::create_and_play_dialog( "general", "perk_deny", undefined, 1 );
  1089.  
  1090.  
  1091. continue;
  1092. }
  1093. }
  1094.  
  1095. if ( player.score < cost )
  1096. {
  1097. //player iprintln( "Not enough points to buy Perk: " + perk );
  1098. self playsound("evt_perk_deny");
  1099. player maps\_zombiemode_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 );
  1100. continue;
  1101. }
  1102.  
  1103. if ( player.num_perks >= level.perk_limit+player.perk_slots )
  1104. {
  1105. //player iprintln( "Too many perks already to buy Perk: " + perk );
  1106. self playsound("evt_perk_deny");
  1107. // COLLIN: do we have a VO that would work for this? if not we'll leave it at just the deny sound
  1108. player maps\_zombiemode_audio::create_and_play_dialog( "general", "sigh" );
  1109. continue;
  1110. }
  1111.  
  1112. sound = "evt_bottle_dispense";
  1113. playsoundatposition(sound, self.origin);
  1114. player maps\_zombiemode_score::minus_to_player_score( cost );
  1115.  
  1116. player.perk_purchased = perk;
  1117.  
  1118. if(isdefined(self.script_label))
  1119. self thread maps\_zombiemode_audio::play_jingle_or_stinger (self.script_label);
  1120. else if(isdefined(level.zombie_perks[perk].sound))
  1121. self thread maps\_zombiemode_audio::play_jingle_or_stinger (level.zombie_perks[perk].sound);
  1122.  
  1123. // do the drink animation
  1124. gun = player perk_give_bottle_begin( perk );
  1125. player waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" );
  1126.  
  1127. // restore player controls and movement
  1128. player perk_give_bottle_end( gun, perk );
  1129.  
  1130. // TODO: race condition?
  1131. if ( player maps\_laststand::player_is_in_laststand() || is_true( player.intermission ) )
  1132. {
  1133. continue;
  1134. }
  1135.  
  1136. if ( isDefined( level.perk_bought_func ) )
  1137. {
  1138. player [[ level.perk_bought_func ]]( perk );
  1139. }
  1140.  
  1141. player.perk_purchased = undefined;
  1142.  
  1143. player give_perk( perk, true );
  1144.  
  1145. //player iprintln( "Bought Perk: " + perk );
  1146. bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type perk",
  1147. player.playername, player.score, level.team_pool[ player.team_num ].score, level.round_number, cost, perk, self.origin );
  1148. }
  1149. }
  1150.  
  1151. // ww: tracks the player's lives in solo, once a life is used then the revive trigger is moved back in to position
  1152. solo_revive_buy_trigger_move( revive_trigger_noteworthy )
  1153. {
  1154. self endon( "death" );
  1155.  
  1156. revive_perk_trigger = GetEnt( revive_trigger_noteworthy, "script_noteworthy" );
  1157.  
  1158. revive_perk_trigger trigger_off();
  1159.  
  1160. if( level.solo_lives_given >= 3 )
  1161. {
  1162. if(IsDefined(level._solo_revive_machine_expire_func))
  1163. {
  1164. revive_perk_trigger [[level._solo_revive_machine_expire_func]]();
  1165. }
  1166.  
  1167. return;
  1168. }
  1169.  
  1170. while( self.lives > 0 )
  1171. {
  1172. wait( 0.1 );
  1173. }
  1174.  
  1175. revive_perk_trigger trigger_on();
  1176. }
  1177.  
  1178. unlocked_perk_upgrade( perk )
  1179. {
  1180. ch_ref = string(tablelookup( "mp/challengeTable_zmPerk.csv", 12, perk, 7 ));
  1181. ch_max = int(tablelookup( "mp/challengeTable_zmPerk.csv", 12, perk, 4 ));
  1182. ch_progress = self getdstat( "challengeStats", ch_ref, "challengeProgress" );
  1183.  
  1184. if( ch_progress >= ch_max )
  1185. {
  1186. return true;
  1187. }
  1188. return false;
  1189. }
  1190.  
  1191. give_perk( perk, bought )
  1192. {
  1193. if(IsCustomPerk(perk))
  1194. self SetCustomPerk( perk );
  1195. else
  1196. self SetPerk( perk );
  1197. self.num_perks++;
  1198.  
  1199. if ( is_true( bought ) )
  1200. {
  1201. //AUDIO: Ayers - Sending Perk Name over to audio common script to play VOX
  1202. self thread maps\_zombiemode_audio::perk_vox( perk );
  1203. self setblur( 4, 0.1 );
  1204. wait(0.1);
  1205. self setblur(0, 0.1);
  1206. //earthquake (0.4, 0.2, self.origin, 100);
  1207.  
  1208. self notify( "perk_bought", perk );
  1209. }
  1210.  
  1211. if(perk == "specialty_armorvest")
  1212. {
  1213. self.preMaxHealth = self.maxhealth;
  1214. self SetMaxHealth( level.zombie_vars["zombie_perk_juggernaut_health"] );
  1215. }
  1216. else if(perk == "specialty_armorvest_upgrade")
  1217. {
  1218. self.preMaxHealth = self.maxhealth;
  1219. self SetMaxHealth( level.zombie_vars["zombie_perk_juggernaut_health_upgrade"] );
  1220. }
  1221.  
  1222. // WW (02-03-11): Deadshot csc call
  1223. if( perk == "specialty_deadshot" )
  1224. {
  1225. self SetClientFlag(level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK);
  1226. }
  1227. else if( perk == "specialty_deadshot_upgrade" )
  1228. {
  1229. self SetClientFlag(level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK);
  1230. }
  1231.  
  1232. // quick revive in solo gives an extra life
  1233. players = getplayers();
  1234. if ( players.size == 1 && perk == "specialty_quickrevive" )
  1235. {
  1236. self.lives = 1;
  1237.  
  1238. level.solo_lives_given++;
  1239.  
  1240. if( level.solo_lives_given >= 3 )
  1241. {
  1242. flag_set( "solo_revive" );
  1243. }
  1244.  
  1245. self thread solo_revive_buy_trigger_move( perk );
  1246.  
  1247. // self disable_trigger();
  1248. }
  1249.  
  1250. self perk_hud_create( perk );
  1251.  
  1252. //stat tracking
  1253. self.stats["perks"]++;
  1254.  
  1255. self thread perk_think( perk );
  1256. }
  1257.  
  1258. check_player_has_perk(perk)
  1259. {
  1260. self endon( "death" );
  1261. /#
  1262. if ( GetDvarInt( #"zombie_cheat" ) >= 5 )
  1263. {
  1264. return;
  1265. }
  1266. #/
  1267.  
  1268. dist = 128 * 128;
  1269. while(true)
  1270. {
  1271. players = get_players();
  1272. for( i = 0; i < players.size; i++ )
  1273. {
  1274. if(DistanceSquared( players[i].origin, self.origin ) < dist)
  1275. {
  1276. if(!players[i] HasThePerk(perk) && !(players[i] in_revive_trigger()) && (!players[i] hacker_active()))
  1277. {
  1278. self setinvisibletoplayer(players[i], false);
  1279. }
  1280. else
  1281. {
  1282. self SetInvisibleToPlayer(players[i], true);
  1283. }
  1284. }
  1285. }
  1286. wait(0.1);
  1287.  
  1288. }
  1289. }
  1290.  
  1291.  
  1292. vending_set_hintstring( perk )
  1293. {
  1294. self UseTriggerRequireLookAt();
  1295. players = get_players();
  1296. if(players.size == 1 && perk == "specialty_quickrevive")
  1297. self SetHintString( "Press & hold &&1 to buy Quick Revive [Cost: 500]" );
  1298. if(isdefined(level.zombie_perks[perk].perk_name_actual))
  1299. self SetHintString( level.zombie_perks[perk].perk_name_actual );
  1300. else
  1301. self SetHintString( "Press & hold &&1 to buy "+level.zombie_perks[perk].perk_name+" [Cost: "+level.zombie_perks[perk].cost+"]" );
  1302. }
  1303.  
  1304.  
  1305. perk_think( perk )
  1306. {
  1307. /#
  1308. if ( GetDvarInt( #"zombie_cheat" ) >= 5 )
  1309. {
  1310. if ( IsDefined( self.perk_hud[ perk ] ) )
  1311. {
  1312. return;
  1313. }
  1314. }
  1315. #/
  1316.  
  1317. perk_str = perk + "_stop";
  1318. result = self waittill_any_return( "fake_death", "death", "player_downed", perk_str );
  1319.  
  1320. do_retain = true;
  1321.  
  1322. if( (get_players().size == 1) && perk == "specialty_quickrevive")
  1323. {
  1324. do_retain = false;
  1325. }
  1326.  
  1327. if(do_retain && IsDefined(self._retain_perks) && self._retain_perks)
  1328. {
  1329. return;
  1330. }
  1331.  
  1332. if(IsCustomPerk(perk))
  1333. self UnsetCustomPerk( perk );
  1334. else
  1335. self UnsetPerk( perk );
  1336. self.num_perks--;
  1337.  
  1338. switch(perk)
  1339. {
  1340. case "specialty_armorvest":
  1341. self SetMaxHealth( 100 );
  1342. break;
  1343.  
  1344. case "specialty_additionalprimaryweapon":
  1345. if ( result == perk_str )
  1346. {
  1347. self maps\_zombiemode::take_additionalprimaryweapon();
  1348. }
  1349. break;
  1350.  
  1351. case "specialty_deadshot":
  1352. self ClearClientFlag(level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK);
  1353. break;
  1354.  
  1355. case "specialty_deadshot_upgrade":
  1356. self ClearClientFlag(level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK);
  1357. break;
  1358. }
  1359.  
  1360. self perk_hud_destroy( perk );
  1361. self.perk_purchased = undefined;
  1362. //self iprintln( "Perk Lost: " + perk );
  1363.  
  1364.  
  1365. if ( IsDefined( level.perk_lost_func ) )
  1366. {
  1367. self [[ level.perk_lost_func ]]( perk );
  1368. }
  1369.  
  1370. self notify( "perk_lost" );
  1371. }
  1372.  
  1373.  
  1374. perk_hud_create( perk )
  1375. {
  1376. if ( !IsDefined( self.perk_hud ) )
  1377. {
  1378. self.perk_hud = [];
  1379. }
  1380.  
  1381. /#
  1382. if ( GetDvarInt( #"zombie_cheat" ) >= 5 )
  1383. {
  1384. if ( IsDefined( self.perk_hud[ perk ] ) )
  1385. {
  1386. return;
  1387. }
  1388. }
  1389. #/
  1390.  
  1391.  
  1392. shader = level.zombie_perks[perk].shader;
  1393.  
  1394. hud = create_simple_hud( self );
  1395. hud.foreground = true;
  1396. hud.sort = 1;
  1397. hud.hidewheninmenu = false;
  1398. hud.alignX = "left";
  1399. hud.alignY = "bottom";
  1400. hud.horzAlign = "user_left";
  1401. hud.vertAlign = "user_bottom";
  1402. hud.x = self.perk_hud.size * 30;
  1403. hud.y = hud.y - 70;
  1404. hud.alpha = 1;
  1405. hud SetShader( shader, 24, 24 );
  1406.  
  1407. self.perk_hud[ perk ] = hud;
  1408. }
  1409.  
  1410.  
  1411. perk_hud_destroy( perk )
  1412. {
  1413. self.perk_hud[ perk ] destroy_hud();
  1414. self.perk_hud[ perk ] = undefined;
  1415. }
  1416.  
  1417. perk_hud_flash()
  1418. {
  1419. self endon( "death" );
  1420.  
  1421. self.flash = 1;
  1422. self ScaleOverTime( 0.05, 32, 32 );
  1423. wait( 0.3 );
  1424. self ScaleOverTime( 0.05, 24, 24 );
  1425. wait( 0.3 );
  1426. self.flash = 0;
  1427. }
  1428.  
  1429. perk_flash_audio( perk )
  1430. {
  1431. alias = undefined;
  1432.  
  1433. switch( perk )
  1434. {
  1435. case "specialty_armorvest":
  1436. alias = "zmb_hud_flash_jugga";
  1437. break;
  1438.  
  1439. case "specialty_quickrevive":
  1440. alias = "zmb_hud_flash_revive";
  1441. break;
  1442.  
  1443. case "specialty_fastreload":
  1444. alias = "zmb_hud_flash_speed";
  1445. break;
  1446.  
  1447. case "specialty_longersprint":
  1448. alias = "zmb_hud_flash_stamina";
  1449. break;
  1450.  
  1451. case "specialty_flakjacket":
  1452. alias = "zmb_hud_flash_phd";
  1453. break;
  1454.  
  1455. case "specialty_deadshot":
  1456. alias = "zmb_hud_flash_deadshot";
  1457. break;
  1458.  
  1459. case "specialty_additionalprimaryweapon":
  1460. alias = "zmb_hud_flash_additionalprimaryweapon";
  1461. break;
  1462. }
  1463.  
  1464. if( IsDefined( alias ) )
  1465. self PlayLocalSound( alias );
  1466. }
  1467.  
  1468. perk_hud_start_flash( perk )
  1469. {
  1470. if ( self HasThePerk( perk ) && isdefined( self.perk_hud ) )
  1471. {
  1472. hud = self.perk_hud[perk];
  1473. if ( isdefined( hud ) )
  1474. {
  1475. if ( !is_true( hud.flash ) )
  1476. {
  1477. hud thread perk_hud_flash();
  1478. self thread perk_flash_audio( perk );
  1479. }
  1480. }
  1481. }
  1482. }
  1483.  
  1484. perk_hud_stop_flash( perk, taken )
  1485. {
  1486. if ( self HasThePerk( perk ) && isdefined( self.perk_hud ) )
  1487. {
  1488. hud = self.perk_hud[perk];
  1489. if ( isdefined( hud ) )
  1490. {
  1491. hud.flash = undefined;
  1492. if ( isdefined( taken ) )
  1493. {
  1494. hud notify( "stop_flash_perk" );
  1495. }
  1496. }
  1497. }
  1498. }
  1499.  
  1500. perk_give_bottle_begin( perk )
  1501. {
  1502. self increment_is_drinking();
  1503.  
  1504. self AllowLean( false );
  1505. self AllowAds( false );
  1506. self AllowSprint( false );
  1507. self AllowCrouch( true );
  1508. self AllowProne( false );
  1509. self AllowMelee( false );
  1510.  
  1511. wait( 0.05 );
  1512.  
  1513. if ( self GetStance() == "prone" )
  1514. {
  1515. self SetStance( "crouch" );
  1516. }
  1517.  
  1518. gun = self GetCurrentWeapon();
  1519. weapon = "";
  1520.  
  1521. weapon = level.zombie_perks[perk].bottle_weapon;
  1522.  
  1523. self GiveWeapon( weapon );
  1524. self SwitchToWeapon( weapon );
  1525.  
  1526. return gun;
  1527. }
  1528.  
  1529.  
  1530. perk_give_bottle_end( gun, perk )
  1531. {
  1532. assert( gun != "zombie_perk_bottle_doubletap" );
  1533. assert( gun != "zombie_perk_bottle_jugg" );
  1534. assert( gun != "zombie_perk_bottle_revive" );
  1535. assert( gun != "zombie_perk_bottle_sleight" );
  1536. assert( gun != "zombie_perk_bottle_marathon" );
  1537. assert( gun != "zombie_perk_bottle_nuke" );
  1538. assert( gun != "zombie_perk_bottle_deadshot" );
  1539. assert( gun != "zombie_perk_bottle_additionalprimaryweapon" );
  1540. assert( gun != "syrette_sp" );
  1541.  
  1542. self AllowLean( true );
  1543. self AllowAds( true );
  1544. self AllowSprint( true );
  1545. self AllowProne( true );
  1546. self AllowMelee( true );
  1547. weapon = "";
  1548. weapon = level.zombie_perks[perk].bottle_weapon;
  1549.  
  1550.  
  1551. // TODO: race condition?
  1552. if ( self maps\_laststand::player_is_in_laststand() || is_true( self.intermission ) )
  1553. {
  1554. self TakeWeapon(weapon);
  1555. return;
  1556. }
  1557.  
  1558. self TakeWeapon(weapon);
  1559.  
  1560. if( self is_multiple_drinking() )
  1561. {
  1562. self decrement_is_drinking();
  1563. return;
  1564. }
  1565. else if( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) )
  1566. {
  1567. self SwitchToWeapon( gun );
  1568. // ww: the knives have no first raise anim so they will never get a "weapon_change_complete" notify
  1569. // meaning it will never leave this funciton and will break buying weapons for the player
  1570. if( is_melee_weapon( gun ) )
  1571. {
  1572. self decrement_is_drinking();
  1573. return;
  1574. }
  1575. }
  1576. else
  1577. {
  1578. // try to switch to first primary weapon
  1579. primaryWeapons = self GetWeaponsListPrimaries();
  1580. if( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 )
  1581. {
  1582. self SwitchToWeapon( primaryWeapons[0] );
  1583. }
  1584. }
  1585.  
  1586. self waittill( "weapon_change_complete" );
  1587.  
  1588. if ( !self maps\_laststand::player_is_in_laststand() && !is_true( self.intermission ) )
  1589. {
  1590. self decrement_is_drinking();
  1591. }
  1592. }
  1593.  
  1594. give_random_perk()
  1595. {
  1596. vending_triggers = GetEntArray( "zombie_vending", "targetname" );
  1597.  
  1598. perks = [];
  1599. for ( i = 0; i < vending_triggers.size; i++ )
  1600. {
  1601. perk = vending_triggers[i].script_noteworthy;
  1602.  
  1603. if ( isdefined( self.perk_purchased ) && self.perk_purchased == perk )
  1604. {
  1605. continue;
  1606. }
  1607.  
  1608. if ( !self HasThePerk( perk ) )
  1609. {
  1610. perks[ perks.size ] = perk;
  1611. }
  1612. }
  1613.  
  1614. if ( perks.size > 0 )
  1615. {
  1616. perks = array_randomize( perks );
  1617. self give_perk( perks[0] );
  1618. }
  1619. }
  1620.  
  1621.  
  1622. lose_random_perk()
  1623. {
  1624. vending_triggers = GetEntArray( "zombie_vending", "targetname" );
  1625.  
  1626. perks = [];
  1627. for ( i = 0; i < vending_triggers.size; i++ )
  1628. {
  1629. perk = vending_triggers[i].script_noteworthy;
  1630.  
  1631. if ( isdefined( self.perk_purchased ) && self.perk_purchased == perk )
  1632. {
  1633. continue;
  1634. }
  1635.  
  1636. if ( self HasThePerk( perk ) )
  1637. {
  1638. perks[ perks.size ] = perk;
  1639. }
  1640. }
  1641.  
  1642. if ( perks.size > 0 )
  1643. {
  1644. perks = array_randomize( perks );
  1645. perk = perks[0];
  1646.  
  1647. perk_str = perk + "_stop";
  1648. self notify( perk_str );
  1649.  
  1650. if ( flag( "solo_game" ) && perk == "specialty_quickrevive" )
  1651. {
  1652. self.lives--;
  1653. }
  1654. }
  1655. }
  1656.  
  1657. update_perk_hud()
  1658. {
  1659. if ( isdefined( self.perk_hud ) )
  1660. {
  1661. keys = getarraykeys( self.perk_hud );
  1662. for ( i = 0; i < self.perk_hud.size; i++ )
  1663. {
  1664. self.perk_hud[ keys[i] ].x = i * 30;
  1665. }
  1666. }
  1667. }
  1668.  
  1669. quantum_bomb_give_nearest_perk_validation( position )
  1670. {
  1671. vending_triggers = GetEntArray( "zombie_vending", "targetname" );
  1672.  
  1673. range_squared = 180 * 180; // 15 feet
  1674. for ( i = 0; i < vending_triggers.size; i++ )
  1675. {
  1676. if ( DistanceSquared( vending_triggers[i].origin, position ) < range_squared )
  1677. {
  1678. return true;
  1679. }
  1680. }
  1681.  
  1682. return false;
  1683. }
  1684.  
  1685.  
  1686. quantum_bomb_give_nearest_perk_result( position )
  1687. {
  1688. [[level.quantum_bomb_play_mystery_effect_func]]( position );
  1689.  
  1690. vending_triggers = GetEntArray( "zombie_vending", "targetname" );
  1691.  
  1692. nearest = 0;
  1693. for ( i = 1; i < vending_triggers.size; i++ )
  1694. {
  1695. if ( DistanceSquared( vending_triggers[i].origin, position ) < DistanceSquared( vending_triggers[nearest].origin, position ) )
  1696. {
  1697. nearest = i;
  1698. }
  1699. }
  1700.  
  1701. players = getplayers();
  1702. perk = vending_triggers[nearest].script_noteworthy;
  1703. for ( i = 0; i < players.size; i++ )
  1704. {
  1705. player = players[i];
  1706.  
  1707. if ( player.sessionstate == "spectator" || player maps\_laststand::player_is_in_laststand() )
  1708. {
  1709. continue;
  1710. }
  1711.  
  1712. if ( !player HasThePerk( perk ) && ( !isdefined( player.perk_purchased ) || player.perk_purchased != perk) && RandomInt( 5 ) ) // 80% chance
  1713. {
  1714. if( player == self )
  1715. {
  1716. self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_good" );
  1717. }
  1718.  
  1719. player give_perk( perk );
  1720. player [[level.quantum_bomb_play_player_effect_func]]();
  1721. }
  1722. }
  1723. }
  1724. perk_slot_setup()
  1725. {
  1726. flag_wait( "all_players_connected" );
  1727. players = get_players();
  1728. for ( i = 0; i < players.size; i++ )
  1729. players[i].perk_slots = 0;
  1730. }
  1731. give_perk_slot()
  1732. {
  1733. if(!isdefined(self.perk_slots))
  1734. self.perk_slots = 0;
  1735. self.perk_slots +=1;
  1736. }
  1737.  
  1738. tufbrew_func( mod, hit_location, hit_origin, player, amount )
  1739. {
  1740. if(player HasThePerk("specialty_bulletdamage") && ( mod == "MOD_RIFLE_BULLET" || mod == "MOD_PISTOL_BULLET" ) )
  1741. {
  1742. if(amount >= self.health)
  1743. player maps\_zombiemode_score::player_add_points( "death", mod, hit_location, self.isdog );
  1744. self DoDamage( amount, player.origin );
  1745. }
  1746. return false;
  1747. }
  1748.  
  1749. /////////////////////////////////////////////////////////////////////////////////////////
  1750. ///////////////////////////////////////candolier/////////////////////////////////////////
  1751. /////////////////////////////////////////////////////////////////////////////////////////
  1752. //note: stock ammo of all weapons should be 2 clip sizes higher than normal ammo
  1753. candolier()
  1754. {
  1755. flag_wait( "all_players_connected" );
  1756. players = get_players();
  1757. for ( i = 0; i < players.size; i++ )
  1758. players[i] thread candolier_ammo();
  1759. }
  1760. candolier_ammo()
  1761. {
  1762. while(1)
  1763. {
  1764. player_weapons = self GetWeaponsListPrimaries();
  1765. for( i=0; i<player_weapons.size; i++ )
  1766. {
  1767. clip = weaponClipSize(player_weapons[i])*2;
  1768. candolier_ammo = WeaponMaxAmmo(player_weapons[i]);
  1769. if (!( self HasThePerk( "specialty_bulletaccuracy" )))
  1770. candolier_ammo -= clip;
  1771. if(self GetWeaponAmmoStock(player_weapons[i]) <= candolier_ammo)
  1772. continue;
  1773. if(self GetAmmoCount(player_weapons[i]) > candolier_ammo)
  1774. self SetWeaponAmmoStock(player_weapons[i], candolier_ammo);
  1775. }
  1776. wait .05;
  1777. }
  1778. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement