‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
All Data Structures Files Functions Variables Macros
_zm_perk_widows_wine.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\laststand_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\visionset_mgr_shared;
10 
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\version.gsh;
13 
14 #using scripts\shared\ai\zombie_utility;
15 
16 #using scripts\zm\_util;
17 #using scripts\zm\_zm;
18 #using scripts\zm\_zm_audio;
19 #using scripts\zm\_zm_bgb;
20 #using scripts\zm\_zm_laststand;
21 #using scripts\zm\_zm_melee_weapon;
22 #using scripts\zm\_zm_net;
23 #using scripts\zm\_zm_perks;
24 #using scripts\zm\_zm_pers_upgrades;
25 #using scripts\zm\_zm_pers_upgrades_functions;
26 #using scripts\zm\_zm_pers_upgrades_system;
27 #using scripts\zm\_zm_powerups;
28 #using scripts\zm\_zm_score;
29 #using scripts\zm\_zm_spawner;
30 #using scripts\zm\_zm_stats;
31 #using scripts\zm\_zm_utility;
32 #using scripts\zm\_zm_weapons;
33 
34 #using scripts\zm\_zm_powerup_ww_grenade;
35 
36 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
37 #insert scripts\zm\_zm_perks.gsh;
38 #insert scripts\zm\_zm_utility.gsh;
39 #insert scripts\zm\_zm_perk_widows_wine.gsh;
40 
41 #namespace zm_perk_widows_wine;
42 
43 #precache( "material", WIDOWS_WINE_SHADER );
44 #precache( "string", "ZOMBIE_PERK_WIDOWS_WINE" );
45 #precache( "fx", WIDOWS_WINE_FX_FILE_MACHINE_LIGHT );
46 #precache( "fx", WIDOWS_WINE_FX_FILE_WRAP );
47 
48 ‪REGISTER_SYSTEM( "zm_perk_widows_wine", &‪__init__, undefined )
49 
50 // WIDOWS WINE
51 
52 //-----------------------------------------------------------------------------------
53 // setup
54 //-----------------------------------------------------------------------------------
55 function ‪__init__()
56 {
58 }
59 
61 {
62  // register widows wine perk for level
68 
70 
71  if( ‪IS_TRUE( level.custom_widows_wine_perk_threads ) )
72  {
73  level thread [[ level.custom_widows_wine_perk_threads ]]();
74  }
75 
76  ‪clientfield::register( "toplayer", "widows_wine_1p_contact_explosion", ‪VERSION_SHIP, 1, "counter" );
77 
79 }
80 
82 {
83  if( isdefined(level.widows_wine_precache_override_func) )
84  {
85  [[ level.widows_wine_precache_override_func ]]();
86  return;
87  }
88 
91 
92  level.machine_assets[‪PERK_WIDOWS_WINE] = SpawnStruct();
93  level.machine_assets[‪PERK_WIDOWS_WINE].weapon = GetWeapon( ‪WIDOWS_WINE_PERK_BOTTLE_WEAPON );
94  level.machine_assets[‪PERK_WIDOWS_WINE].off_model = ‪WIDOWS_WINE_MACHINE_DISABLED_MODEL;
95  level.machine_assets[‪PERK_WIDOWS_WINE].on_model = ‪WIDOWS_WINE_MACHINE_ACTIVE_MODEL;
96 }
97 
99 {
101 
103 
105 }
106 
108 {
110 }
111 
112 function ‪widows_wine_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collision )
113 {
114  use_trigger.script_sound = "mus_perks_widow_jingle";
115  use_trigger.script_string = "widowswine_perk";
116  use_trigger.script_label = "mus_perks_widow_sting";
117  use_trigger.target = "vending_widowswine";
118  perk_machine.script_string = "widowswine_perk";
119  perk_machine.targetname = "vending_widowswine";
120 
121  if( isdefined( bump_trigger ) )
122  {
123  bump_trigger.script_string = "widowswine_perk";
124  }
125 }
126 
127 //-----------------------------------------------------------------------------------
128 // functionality
129 //-----------------------------------------------------------------------------------
131 {
137  level.w_widows_wine_grenade = GetWeapon( ‪WIDOWS_WINE_GRENADE );
138 
140  level.w_widows_wine_knife = GetWeapon( ‪WIDOWS_WINE_KNIFE );
141 
143  level.w_widows_wine_bowie_knife = GetWeapon( ‪WIDOWS_WINE_BOWIE_KNIFE );
144 
146  level.w_widows_wine_sickle_knife = GetWeapon( ‪WIDOWS_WINE_SICKLE_KNIFE );
147 }
148 
149 //--------------------------------------------------------------------------
150 // Functionality
151 //--------------------------------------------------------------------------
152 
153 
154 // self is a player with widow's wine perk
156 {
157  if ( level.w_widows_wine_grenade == self ‪zm_utility::get_player_lethal_grenade() )
158  {
159  // they must've been given this again while they hadn't finished the lost function that takes all the special weapons away, don't do any of this
160  return;
161  }
162 
163  // replace your grenades with widows_wine grenades
164  self.w_widows_wine_prev_grenade = self ‪zm_utility::get_player_lethal_grenade();
165  self TakeWeapon( self.w_widows_wine_prev_grenade );
166 
167  // Give the widow's wine grenade and wait for them to be thrown
168  self GiveWeapon( level.w_widows_wine_grenade );
169  self ‪zm_utility::set_player_lethal_grenade( level.w_widows_wine_grenade );
170 
171  self.w_widows_wine_prev_knife = self ‪zm_utility::get_player_melee_weapon();
172 
173  if ( isdefined( self.widows_wine_knife_override ) )
174  {
175  self [[self.widows_wine_knife_override]]();
176  }
177  else
178  {
179  // replace your knife with widows_wine knife
180  self TakeWeapon( self.w_widows_wine_prev_knife );
181 
182  if( self.w_widows_wine_prev_knife.name == "bowie_knife" )
183  {
184  // Give the widow's wine bowie knife
185  self GiveWeapon( level.w_widows_wine_bowie_knife );
186  self ‪zm_utility::set_player_melee_weapon( level.w_widows_wine_bowie_knife );
187  }
188  else if( self.w_widows_wine_prev_knife.name == "sickle_knife" )
189  {
190  // Give the widow's wine sickle knife
191  self GiveWeapon( level.w_widows_wine_sickle_knife );
192  self ‪zm_utility::set_player_melee_weapon( level.w_widows_wine_sickle_knife );
193  }
194  else
195  {
196  // Give the widow's wine knife
197  self GiveWeapon( level.w_widows_wine_knife );
198  self ‪zm_utility::set_player_melee_weapon( level.w_widows_wine_knife );
199  }
200  }
201 
202  assert( !IsDefined( self.check_override_wallbuy_purchase ) || self.check_override_wallbuy_purchase == &‪widows_wine_override_wallbuy_purchase );
203  assert( !IsDefined( self.check_override_melee_wallbuy_purchase ) || self.check_override_melee_wallbuy_purchase == &‪widows_wine_override_melee_wallbuy_purchase );
204  self.check_override_wallbuy_purchase = &‪widows_wine_override_wallbuy_purchase;
205  self.check_override_melee_wallbuy_purchase = &‪widows_wine_override_melee_wallbuy_purchase;
206 
207  self thread ‪grenade_bounce_monitor();
208 }
209 
210 // if zombie hits player, auto-explodes grenade
212 {
213  self MagicGrenadeType( self.current_lethal_grenade, self.origin + ( 0, 0, 48 ), ( 0, 0, 0 ), 0.0 );
214  self setWeaponAmmoClip( self.current_lethal_grenade, self getWeaponAmmoClip( self.current_lethal_grenade ) - 1 );
215  self ‪clientfield::increment_to_player( "widows_wine_1p_contact_explosion", 1 );
216 }
217 
218 #define WW_MELEE_COCOON_CHANCE 0.50
219 
220 // self is a zombie
221 function ‪widows_wine_zombie_damage_response( str_mod, str_hit_location, v_hit_origin, e_player, n_amount, w_weapon, direction_vec, tagName, modelName, partName, dFlags, inflictor, chargeLevel )
222 {
223  if ( ( isdefined( self.damageweapon ) && self.damageweapon == level.w_widows_wine_grenade ) ||
224  ( ‪IS_EQUAL(str_mod,"MOD_MELEE") && IsDefined(e_player) && IsPlayer(e_player) && e_player HasPerk( ‪PERK_WIDOWS_WINE ) && RandomFloat(1.0) <= ‪WW_MELEE_COCOON_CHANCE ) )
225  {
226  if(!‪IS_TRUE(self.no_widows_wine))
227  {
228  // if we have instakill, apply that
229  self thread ‪zm_powerups::check_for_instakill( e_player, str_mod, str_hit_location );
230 
231  n_dist_sq = DistanceSquared( self.origin, v_hit_origin );
232 
233  // Nearby zombies are cocooned
234  if ( n_dist_sq <= ‪WIDOWS_WINE_COCOON_RADIUS_SQ )
235  {
236  self thread ‪widows_wine_cocoon_zombie( e_player );
237  }
238  // Further away is merely slow
239  else
240  {
241  self thread ‪widows_wine_slow_zombie( e_player );
242  }
243 
244  if ( !‪IS_TRUE( self.no_damage_points ) && IsDefined(e_player) )
245  {
246  damage_type = "damage";
247  e_player ‪zm_score::player_add_points( damage_type, str_mod, str_hit_location, false, undefined, w_weapon );
248  }
249 
250  return true;
251  }
252  }
253 
254  return false;
255 }
256 
257 //self is a vehicle
258 function ‪widows_wine_vehicle_damage_response( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
259 {
260  if ( isdefined( weapon ) && weapon == level.w_widows_wine_grenade && !‪IS_TRUE( self.b_widows_wine_cocoon ) )
261  {
262  // Only apply stuck grenade monitor to Parasites
263  if ( self.archetype === ‪ARCHETYPE_PARASITE )
264  {
265  self thread ‪vehicle_stuck_grenade_monitor();
266  }
267  self thread ‪widows_wine_vehicle_behavior( eAttacker, weapon );
268 
269  if ( !‪IS_TRUE( self.no_damage_points ) && IsDefined(eAttacker) )
270  {
271  damage_type = "damage";
272  eAttacker ‪zm_score::player_add_points( damage_type, sMeansOfDeath, sHitLoc, false, undefined, weapon );
273  }
274 
275  return 0;
276  }
277  return iDamage;
278 }
279 
280 // Contact explosion function - When zombie hits player with Widow's Wine grenades, grenade will auto explode
281 // self is player
282 function ‪widows_wine_damage_callback( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
283 {
284  if ( sWeapon == level.w_widows_wine_grenade )
285  {
286  return 0;
287  }
288 
289  // Contact explosion will only work if:
290  // Zombie melee's player
291  // Player carries widow's wine grenades
292  // Player has more than 2 grenades
293  // Player does not have the Burned Out bubblegum buff
294  if ( self.current_lethal_grenade == level.w_widows_wine_grenade
295  && self getWeaponAmmoClip( self.current_lethal_grenade ) > ‪WIDOWS_WINE_CONTACT_EXPLOSION_COUNT
296  && !self ‪bgb::is_enabled( "zm_bgb_burned_out" ) )
297  {
298  if ( ( sMeansOfDeath == "MOD_MELEE" && IsAI(eAttacker) ) ||
299  ( sMeansOfDeath == "MOD_EXPLOSIVE" && IsVehicle( eAttacker ) ) )
300  {
301  self thread ‪widows_wine_contact_explosion();
302  return iDamage;
303  }
304  }
305 }
306 
307 #define WW_POWERUP_DROP_CHANCE_WEBBING 0.15
308 #define WW_POWERUP_DROP_CHANCE_NORMAL 0.20
309 #define WW_POWERUP_DROP_CHANCE_MELEE 0.25
310 
312 {
313  if ( ( ‪IS_TRUE( self.b_widows_wine_cocoon ) || ‪IS_TRUE( self.b_widows_wine_slow ) ) && !‪IS_TRUE( self.b_widows_wine_no_powerup ) )
314  {
315  if ( IsDefined(self.attacker) && IsPlayer(self.attacker) && self.attacker HasPerk( ‪PERK_WIDOWS_WINE ) )
316  {
318  if ( isdefined( self.damageweapon ) && self.damageweapon == level.w_widows_wine_grenade )
319  {
321  }
322  else if ( isdefined( self.damageweapon ) && ( self.damageweapon == level.w_widows_wine_knife || self.damageweapon == level.w_widows_wine_bowie_knife || self.damageweapon == level.w_widows_wine_sickle_knife ) )
323  {
325  }
326  if ( RandomFloat( 1.0 ) <= chance )
327  {
328  self.no_powerups = true;
329  level._powerup_timeout_override = &‪powerup_widows_wine_timeout;
330  level thread ‪zm_powerups::specific_powerup_drop( "ww_grenade", self.origin, undefined, undefined, undefined, self.attacker );
331  level._powerup_timeout_override = undefined;
332  }
333  }
334  }
335 }
336 
337 
339 {
340  self endon( "powerup_grabbed" );
341  self endon( "death" );
342  self endon("powerup_reset");
343 
344  self ‪zm_powerups::powerup_show( true );
345 
346  wait_time = 1;
347  if (isDefined( level._powerup_timeout_custom_time ) )
348  {
349  time = [[level._powerup_timeout_custom_time]](self);
350  if ( time == 0 )
351  {
352  return;
353  }
354  wait_time = time;
355 
356  }
357 
358  wait wait_time;
359 
360  for ( i = 20; i > 0; i-- )
361  {
362  // hide and show
363  if ( i % 2 )
364  {
365  self ‪zm_powerups::powerup_show( false );
366  }
367  else
368  {
369  self ‪zm_powerups::powerup_show( true );
370  }
371 
372  if( i > 15 )
373  {
374  wait( 0.3 );
375  }
376  if ( i > 10 )
377  {
378  wait( 0.25 );
379  }
380  else if ( i > 5 )
381  {
382  wait( 0.15 );
383  }
384  else
385  {
386  wait( 0.1 );
387  }
388  }
389 
390  self notify( "powerup_timedout" );
392 }
393 
394 
395 #define WIDOWS_WINE_COCOON_MAX_SCORE 10
396 #define WIDOWS_WINE_SLOW_MAX_SCORE 6
397 
398 function ‪widows_wine_cocoon_zombie_score( e_player, duration, max_score )
399 {
400  self notify( "widows_wine_cocoon_zombie_score" );
401  self endon( "widows_wine_cocoon_zombie_score" );
402  self endon( "death" );
403 
404  ‪DEFAULT(self.ww_points_given,0);
405  start_time = GetTime();
406  end_time = start_time + (duration * 1000);
407  while( GetTime() < end_time && self.ww_points_given < max_score )
408  {
409  e_player ‪zm_score::add_to_player_score( 10 ); //player_add_points( "ww_webbed", "MOD_UNKNOWN", "none" ,false, level.zombie_team, damage_weapon );
410  wait duration / max_score;
411  }
412 
413 }
414 
415 // zombie is immobilized by web
416 // self is a zombie
417 function ‪widows_wine_cocoon_zombie( e_player )
418 {
419  // Multiple calls from subsequent grenades should extend the effect
420  self notify( "widows_wine_cocoon" );
421 
422  self endon( "widows_wine_cocoon" );
423 
424  if ( ‪IS_TRUE( self.kill_on_wine_coccon ) )
425  {
426  self Kill();
427  }
428 
429  if ( !‪IS_TRUE( self.b_widows_wine_cocoon ) )
430  {
431  self.b_widows_wine_cocoon = true;
432  self.e_widows_wine_player = e_player;
433 
434  if( isdefined(self.widows_wine_cocoon_fraction_rate) )
435  {
436  widows_wine_cocoon_fraction_rate = self.widows_wine_cocoon_fraction_rate;
437  }
438  else
439  {
440  widows_wine_cocoon_fraction_rate = ‪WIDOWS_WINE_COCOON_FRACTION;
441  }
442 
443  self ASMSetAnimationRate( widows_wine_cocoon_fraction_rate );
444 
445  self ‪clientfield::set( ‪CF_WIDOWS_WINE_WRAP, 1 ); // turn on wrap FX
446  }
447 
448  if ( IsDefined(e_player) )
449  {
451  }
452 
453  self ‪util::waittill_any_timeout( ‪WIDOWS_WINE_COCOON_DURATION, "death", "widows_wine_cocoon" );
454 
455  if (!IsDefined(self))
456  return;
457 
458  self ASMSetAnimationRate( 1.0 );
459  self ‪clientfield::set( ‪CF_WIDOWS_WINE_WRAP, 0 ); // turn off wrap FX
460 
461  if ( IsAlive( self ) )
462  {
463  self.b_widows_wine_cocoon = false;
464  }
465 }
466 
467 
468 // zombie is slowed by webbing
469 // self is a zombie
470 function ‪widows_wine_slow_zombie( e_player )
471 {
472  // Multiple calls from subsequent grenades should extend the effect
473  self notify( "widows_wine_slow" );
474 
475  self endon( "widows_wine_slow" );
476 
477  if ( ‪IS_TRUE( self.b_widows_wine_cocoon ) )
478  {
479  // Should just increase cocoon time
480  self thread ‪widows_wine_cocoon_zombie( e_player );
481  return;
482  }
483 
484  if ( IsDefined(e_player) )
485  {
487  }
488 
489  if ( !‪IS_TRUE( self.b_widows_wine_slow ) )
490  {
491  if( isdefined(self.widows_wine_slow_fraction_rate) )
492  {
493  widows_wine_slow_fraction_rate = self.widows_wine_slow_fraction_rate;
494  }
495  else
496  {
497  widows_wine_slow_fraction_rate = ‪WIDOWS_WINE_SLOW_FRACTION;
498  }
499 
500  self.b_widows_wine_slow = true;
501  self ASMSetAnimationRate( widows_wine_slow_fraction_rate );
502  self ‪clientfield::set( ‪CF_WIDOWS_WINE_WRAP, 1 ); // turn on wrap FX
503  }
504  self ‪util::waittill_any_timeout( ‪WIDOWS_WINE_SLOW_DURATION, "death", "widows_wine_slow" );
505 
506  if (!IsDefined(self))
507  return;
508 
509  self ASMSetAnimationRate( 1.0 );
510  self ‪clientfield::set( ‪CF_WIDOWS_WINE_WRAP, 0 ); // turn off wrap FX
511 
512  if ( IsAlive( self ) )
513  {
514  self.b_widows_wine_slow = false;
515  }
516 }
517 
518 // If the grenade strikes a Parasite, explode immediately
520 {
521  self endon( "death" );
522 
523  self waittill( "grenade_stuck", e_grenade );
524 
525  e_grenade Detonate();
526 }
527 
528 // Monitors thrown grenades for Elementals
530 {
531  self endon( "disconnect" );
532  self endon( "stop_widows_wine" );
533 
534  while ( true )
535  {
536  self waittill( "grenade_fire", e_grenade );
537  e_grenade thread ‪grenade_bounces();
538  }
539 }
540 
541 // If grenade bounces off an Elemental, explode immediately
543 {
544  self endon( "explode" );
545 
546  self waittill( "grenade_bounce", pos, normal, ‪e_target );
547 
548  if ( IsDefined(‪e_target) )
549  {
550  if ( ‪e_target.archetype === ‪ARCHETYPE_PARASITE || ‪e_target.archetype === ‪ARCHETYPE_RAPS )
551  {
552  self Detonate();
553  }
554  }
555 }
556 
557 //self is a vehicle
558 function ‪widows_wine_vehicle_behavior( attacker, weapon )
559 {
560  self endon( "death" );
561 
562  self.b_widows_wine_cocoon = true;
563 
564  if( IsDefined( self.archetype ) )
565  {
566  //If an Elemental, slows them down, applies FX, then kills them after a duration
567  if( self.archetype == ‪ARCHETYPE_RAPS )
568  {
569  self ‪clientfield::set( ‪CF_WIDOWS_WINE_WRAP, 1 ); // turn on wrap FX
570  self._override_raps_combat_speed = ‪WIDOWS_WINE_ELEMENTAL_SPEED_OVERRIDE;
571 
572  wait( 0.5 * ‪WIDOWS_WINE_SLOW_DURATION );
573 
574  self DoDamage( self.health + 1000, self.origin, attacker, undefined, "none", "MOD_EXPLOSIVE", 0, weapon );
575  }
576  // If a Parasite, automatically kills them
577  else if( self.archetype == ‪ARCHETYPE_PARASITE )
578  {
579  wait ‪SERVER_FRAME; // Wait so that damage does not apply to Parasite stuck by grenade
580  self DoDamage( self.maxhealth, self.origin );
581  }
582  }
583 }
584 
586 //Perk lost func
588 
589 // self is a player
590 function ‪widows_wine_perk_lost( b_pause, str_perk, str_result )
591 {
592  self notify( "stop_widows_wine" );
593  self endon( "death" );
594 
596  {
597  self waittill( "player_revived" );
598 
599  if ( self HasPerk( ‪PERK_WIDOWS_WINE ) )
600  {
601  // they must've gotten it back between when this function ran and when they got revived, we shouldn't do any of this anymore
602  return;
603  }
604  }
605 
606  self.check_override_wallbuy_purchase = undefined;
607 
608  self TakeWeapon( level.w_widows_wine_grenade );
609  if ( isdefined( self.w_widows_wine_prev_grenade ) )
610  {
611  // Redefines last stand grenade from zm::last_stand_grenade_save_and_return()
612  self.lsgsar_lethal = self.w_widows_wine_prev_grenade;
613  self GiveWeapon( self.w_widows_wine_prev_grenade );
614  self ‪zm_utility::set_player_lethal_grenade( self.w_widows_wine_prev_grenade );
615  }
616  else
617  {
619  }
621  self GiveStartAmmo( grenade );
622 
623  // widows wine knife can be bypassed by better melee weapon, ie. one inch punch
624  if( isdefined( self.current_melee_weapon ) && !IsSubStr( self.current_melee_weapon.name, "widows_wine" ) )
625  {
626  self.w_widows_wine_prev_knife = self.current_melee_weapon;
627  }
628  else if( self.w_widows_wine_prev_knife.name == "bowie_knife" )
629  {
630  self TakeWeapon( level.w_widows_wine_bowie_knife );
631  }
632  else if( self.w_widows_wine_prev_knife.name == "sickle_knife" )
633  {
634  self TakeWeapon( level.w_widows_wine_sickle_knife );
635  }
636  else
637  {
638  self TakeWeapon( level.w_widows_wine_knife );
639  }
640 
641  if ( isdefined( self.w_widows_wine_prev_knife ) )
642  {
643  self GiveWeapon( self.w_widows_wine_prev_knife );
644  self ‪zm_utility::set_player_melee_weapon( self.w_widows_wine_prev_knife );
645  }
646  else
647  {
649  }
650 }
651 
652 function ‪widows_wine_override_wallbuy_purchase( weapon, wallbuy )
653 {
654  // Can not buy ammo for Widows Wine from wall.
655  if ( ‪zm_utility::is_lethal_grenade( weapon ) )
656  {
657  wallbuy ‪zm_utility::play_sound_on_ent( "no_purchase" );
658  if ( isdefined( level.custom_generic_deny_vo_func ) )
659  {
660  self [[level.custom_generic_deny_vo_func]]();
661  }
662  else
663  {
664  self ‪zm_audio::create_and_play_dialog( "general", "sigh" );
665  }
666 
667  return true;
668  }
669 
670  return false;
671 }
672 
673 function ‪widows_wine_override_melee_wallbuy_purchase( vo_dialog_id, flourish_weapon, weapon, ballistic_weapon, ballistic_upgraded_weapon, flourish_fn, wallbuy )
674 {
675  if ( ‪zm_utility::is_melee_weapon( weapon ) )
676  {
677  if ( self.w_widows_wine_prev_knife != weapon )
678  {
679  cost = wallbuy.stub.cost;
680 
681  if ( self ‪zm_score::can_player_purchase( cost ) )
682  {
683  if ( wallbuy.first_time_triggered == false )
684  {
685  model = getent( wallbuy.target, "targetname" );
686 
687  if ( isdefined( model ) )
688  {
689  model thread ‪zm_melee_weapon::melee_weapon_show( self );
690  }
691  else if ( isdefined( wallbuy.clientFieldName ) )
692  {
693  level ‪clientfield::set( wallbuy.clientFieldName, 1 );
694  }
695 
696  wallbuy.first_time_triggered = true;
697  if ( isdefined( wallbuy.stub ) )
698  {
699  wallbuy.stub.first_time_triggered = true;
700  }
701 
702  }
703 
705 
706 
707  assert( weapon.name == "bowie_knife" || weapon.name == "sickle_knife" );
708  self.w_widows_wine_prev_knife = weapon;
709  if( self.w_widows_wine_prev_knife.name == "bowie_knife" )
710  {
711  self thread ‪zm_melee_weapon::give_melee_weapon( vo_dialog_id, flourish_weapon, weapon, ballistic_weapon, ballistic_upgraded_weapon, flourish_fn, wallbuy );
712  }
713  else if( self.w_widows_wine_prev_knife.name == "sickle_knife" )
714  {
715  self thread ‪zm_melee_weapon::give_melee_weapon( vo_dialog_id, flourish_weapon, weapon, ballistic_weapon, ballistic_upgraded_weapon, flourish_fn, wallbuy );
716  }
717  }
718  else
719  {
720  ‪zm_utility::play_sound_on_ent( "no_purchase" );
721  self ‪zm_audio::create_and_play_dialog( "general", "outofmoney", 1 );
722  }
723  }
724  return true;
725  }
726  return false;
727 }
‪WIDOWS_WINE_COCOON_RADIUS_SQ
‪#define WIDOWS_WINE_COCOON_RADIUS_SQ
Definition: _zm_perk_widows_wine.gsh:17
‪powerup_delete
‪function powerup_delete()
Definition: _zm_powerups.gsc:1407
‪widows_wine_cocoon_zombie_score
‪function widows_wine_cocoon_zombie_score(e_player, duration, max_score)
Definition: _zm_perk_widows_wine.gsc:398
‪WIDOWS_WINE_PERK_COST
‪#define WIDOWS_WINE_PERK_COST
Definition: _zm_perk_widows_wine.gsh:4
‪widows_wine_slow_zombie
‪function widows_wine_slow_zombie(e_player)
Definition: _zm_perk_widows_wine.gsc:470
‪__init__
‪function __init__()
Definition: _zm_perk_widows_wine.gsc:55
‪widows_wine_zombie_death_watch
‪function widows_wine_zombie_death_watch(attacker)
Definition: _zm_perk_widows_wine.gsc:311
‪WIDOWS_WINE_CONTACT_EXPLOSION_COUNT
‪#define WIDOWS_WINE_CONTACT_EXPLOSION_COUNT
Definition: _zm_perk_widows_wine.gsh:14
‪enable_widows_wine_perk_for_level
‪function enable_widows_wine_perk_for_level()
Definition: _zm_perk_widows_wine.gsc:60
‪register_vehicle_damage_callback
‪function register_vehicle_damage_callback(func)
Definition: _zm.gsc:5597
‪register_lethal_grenade_for_level
‪function register_lethal_grenade_for_level(weaponname)
Definition: _zm_utility.gsc:4128
‪e_target
‪var e_target
Definition: traps_shared.gsc:2029
‪widows_wine_cocoon_zombie
‪function widows_wine_cocoon_zombie(e_player)
Definition: _zm_perk_widows_wine.gsc:417
‪WIDOWS_WINE_FX_FILE_MACHINE_LIGHT
‪#define WIDOWS_WINE_FX_FILE_MACHINE_LIGHT
Definition: _zm_perk_widows_wine.gsh:30
‪WW_POWERUP_DROP_CHANCE_MELEE
‪#define WW_POWERUP_DROP_CHANCE_MELEE
Definition: _zm_perk_widows_wine.gsc:309
‪register_perk_clientfields
‪function register_perk_clientfields(str_perk, func_clientfield_register, func_code_callback)
Definition: _zm_perks.csc:96
‪is_lethal_grenade
‪function is_lethal_grenade(weapon)
Definition: _zm_utility.gsc:4145
‪WIDOWS_WINE_SLOW_DURATION
‪#define WIDOWS_WINE_SLOW_DURATION
Definition: _zm_perk_widows_wine.gsh:24
‪play_sound_on_ent
‪function play_sound_on_ent(ref)
Definition: _zm_utility.gsc:3070
‪init_widows_wine
‪function init_widows_wine()
Definition: _zm_perk_widows_wine.gsc:130
‪widows_wine_vehicle_damage_response
‪function widows_wine_vehicle_damage_response(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal)
Definition: _zm_perk_widows_wine.gsc:258
‪player_add_points
‪function player_add_points(event, mod, hit_location, is_dog, zombie_team, damage_weapon)
Definition: _zm_score.gsc:129
‪specific_powerup_drop
‪function specific_powerup_drop(powerup_name, drop_spot, powerup_team, powerup_location, pickup_delay, powerup_player, b_stay_forever)
Definition: _zm_powerups.gsc:688
‪WIDOWS_WINE_COCOON_DURATION
‪#define WIDOWS_WINE_COCOON_DURATION
Definition: _zm_perk_widows_wine.gsh:19
‪add_to_player_score
‪function add_to_player_score(points, b_add_to_total=true, str_awarded_by="")
Definition: _zm_score.gsc:521
‪init_player_melee_weapon
‪function init_player_melee_weapon()
Definition: _zm_utility.gsc:4386
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪WIDOWS_WINE_PERK_BOTTLE_WEAPON
‪#define WIDOWS_WINE_PERK_BOTTLE_WEAPON
Definition: _zm_perk_widows_wine.gsh:5
‪check_for_instakill
‪function check_for_instakill(player, mod, hit_location)
Definition: _zm_powerups.gsc:1438
‪vehicle_stuck_grenade_monitor
‪function vehicle_stuck_grenade_monitor()
Definition: _zm_perk_widows_wine.gsc:519
‪widows_wine_register_clientfield
‪function widows_wine_register_clientfield()
Definition: _zm_perk_widows_wine.gsc:98
‪register_perk_basic_info
‪function register_perk_basic_info(str_perk, str_alias, n_perk_cost, str_hint_string, w_perk_bottle_weapon)
Definition: _zm_perks.gsc:1820
‪WIDOWS_WINE_KNIFE
‪#define WIDOWS_WINE_KNIFE
Definition: _zm_perk_widows_wine.gsh:11
‪waittill_any_timeout
‪function waittill_any_timeout(n_timeout, string1, string2, string3, string4, string5)
Definition: util_shared.csc:423
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪WIDOWS_WINE_BOWIE_KNIFE
‪#define WIDOWS_WINE_BOWIE_KNIFE
Definition: _zm_perk_widows_wine.gsh:12
‪get_player_melee_weapon
‪function get_player_melee_weapon()
Definition: _zm_utility.gsc:4361
‪WIDOWS_WINE_NAME
‪#define WIDOWS_WINE_NAME
Definition: _zm_perk_widows_wine.gsh:3
‪WIDOWS_WINE_SLOW_FRACTION
‪#define WIDOWS_WINE_SLOW_FRACTION
Definition: _zm_perk_widows_wine.gsh:23
‪widows_wine_perk_activate
‪function widows_wine_perk_activate()
Definition: _zm_perk_widows_wine.gsc:155
‪WIDOWS_WINE_FX_MACHINE_LIGHT
‪#define WIDOWS_WINE_FX_MACHINE_LIGHT
Definition: _zm_perk_widows_wine.gsh:27
‪register_zombie_death_event_callback
‪function register_zombie_death_event_callback(func)
Definition: _zm_spawner.gsc:2463
‪ARCHETYPE_PARASITE
‪#define ARCHETYPE_PARASITE
Definition: archetype_shared.gsh:38
‪register_perk_machine
‪function register_perk_machine(str_perk, func_perk_machine_setup, func_perk_machine_thread)
Definition: _zm_perks.gsc:1849
‪WIDOWS_WINE_SLOW_MAX_SCORE
‪#define WIDOWS_WINE_SLOW_MAX_SCORE
Definition: _zm_perk_widows_wine.gsc:396
‪powerup_show
‪function powerup_show(visible)
Definition: _zm_powerups.gsc:1314
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪minus_to_player_score
‪function minus_to_player_score(points)
Definition: _zm_score.gsc:551
‪register_perk_precache_func
‪function register_perk_precache_func(str_perk, func_precache)
Definition: _zm_perks.gsc:1900
‪can_player_purchase
‪function can_player_purchase(n_cost)
Definition: _zm_score.gsc:655
‪PERK_CLIENTFIELD_WIDOWS_WINE
‪#define PERK_CLIENTFIELD_WIDOWS_WINE
Definition: _zm_perks.gsh:20
‪widows_wine_perk_lost
‪function widows_wine_perk_lost(b_pause, str_perk, str_result)
Definition: _zm_perk_widows_wine.gsc:590
‪widows_wine_precache
‪function widows_wine_precache()
Definition: _zm_perk_widows_wine.gsc:81
‪grenade_bounce_monitor
‪function grenade_bounce_monitor()
Definition: _zm_perk_widows_wine.gsc:529
‪increment_to_player
‪function increment_to_player(str_field_name, n_increment_count=1)
Definition: clientfield_shared.gsc:169
‪WIDOWS_WINE_SICKLE_KNIFE
‪#define WIDOWS_WINE_SICKLE_KNIFE
Definition: _zm_perk_widows_wine.gsh:13
‪WW_POWERUP_DROP_CHANCE_WEBBING
‪#define WW_POWERUP_DROP_CHANCE_WEBBING
Definition: _zm_perk_widows_wine.gsc:307
‪widows_wine_set_clientfield
‪function widows_wine_set_clientfield(state)
Definition: _zm_perk_widows_wine.gsc:107
‪grenade_bounces
‪function grenade_bounces()
Definition: _zm_perk_widows_wine.gsc:542
‪SERVER_FRAME
‪#define SERVER_FRAME
Definition: shared.gsh:264
‪is_enabled
‪function is_enabled(name)
Definition: _zm_bgb.gsc:4
‪ARCHETYPE_RAPS
‪#define ARCHETYPE_RAPS
Definition: archetype_shared.gsh:33
‪widows_wine_zombie_damage_response
‪function widows_wine_zombie_damage_response(str_mod, str_hit_location, v_hit_origin, e_player, n_amount, w_weapon, direction_vec, tagName, modelName, partName, dFlags, inflictor, chargeLevel)
Definition: _zm_perk_widows_wine.gsc:221
‪WW_POWERUP_DROP_CHANCE_NORMAL
‪#define WW_POWERUP_DROP_CHANCE_NORMAL
Definition: _zm_perk_widows_wine.gsc:308
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪register_perk_threads
‪function register_perk_threads(str_perk, func_give_player_perk, func_take_player_perk)
Definition: _zm_perks.gsc:1924
‪widows_wine_perk_machine_setup
‪function widows_wine_perk_machine_setup(use_trigger, perk_machine, bump_trigger, collision)
Definition: _zm_perk_widows_wine.gsc:112
‪register_zombie_damage_callback
‪function register_zombie_damage_callback(func)
Definition: _zm_spawner.gsc:2114
‪widows_wine_override_melee_wallbuy_purchase
‪function widows_wine_override_melee_wallbuy_purchase(vo_dialog_id, flourish_weapon, weapon, ballistic_weapon, ballistic_upgraded_weapon, flourish_fn, wallbuy)
Definition: _zm_perk_widows_wine.gsc:673
‪CF_WIDOWS_WINE_WRAP
‪#define CF_WIDOWS_WINE_WRAP
Definition: _zm_perk_widows_wine.gsh:34
‪register_perk_host_migration_params
‪function register_perk_host_migration_params(str_perk, str_radiant_name, str_effect_name)
Definition: _zm_perks.gsc:1986
‪widows_wine_contact_explosion
‪function widows_wine_contact_explosion()
Definition: _zm_perk_widows_wine.gsc:211
‪WIDOWS_WINE_FX_FILE_WRAP
‪#define WIDOWS_WINE_FX_FILE_WRAP
Definition: _zm_perk_widows_wine.gsh:31
‪PERK_WIDOWS_WINE
‪#define PERK_WIDOWS_WINE
Definition: _zm_perks.gsh:35
‪give_melee_weapon
‪function give_melee_weapon(vo_dialog_id, flourish_weapon, weapon, ballistic_weapon, ballistic_upgraded_weapon, flourish_fn, trigger)
Definition: _zm_melee_weapon.gsc:600
‪init_player_lethal_grenade
‪function init_player_lethal_grenade()
Definition: _zm_utility.gsc:4192
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪IS_EQUAL
‪#define IS_EQUAL(__a, __b)
Definition: shared.gsh:250
‪register_melee_weapon_for_level
‪function register_melee_weapon_for_level(weaponname)
Definition: _zm_utility.gsc:4322
‪get_player_lethal_grenade
‪function get_player_lethal_grenade()
Definition: _zm_utility.gsc:4167
‪player_is_in_laststand
‪function player_is_in_laststand()
Definition: laststand_shared.gsc:18
‪powerup_widows_wine_timeout
‪function powerup_widows_wine_timeout()
Definition: _zm_perk_widows_wine.gsc:338
‪WIDOWS_WINE_MACHINE_ACTIVE_MODEL
‪#define WIDOWS_WINE_MACHINE_ACTIVE_MODEL
Definition: _zm_perk_widows_wine.gsh:8
‪WIDOWS_WINE_RADIANT_MACHINE_NAME
‪#define WIDOWS_WINE_RADIANT_MACHINE_NAME
Definition: _zm_perk_widows_wine.gsh:9
‪is_melee_weapon
‪function is_melee_weapon(weapon)
Definition: _zm_utility.gsc:4339
‪widows_wine_override_wallbuy_purchase
‪function widows_wine_override_wallbuy_purchase(weapon, wallbuy)
Definition: _zm_perk_widows_wine.gsc:652
‪WIDOWS_WINE_COCOON_MAX_SCORE
‪#define WIDOWS_WINE_COCOON_MAX_SCORE
Definition: _zm_perk_widows_wine.gsc:395
‪set_player_uimodel
‪function set_player_uimodel(str_field_name, n_value)
Definition: clientfield_shared.gsc:75
‪WIDOWS_WINE_ELEMENTAL_SPEED_OVERRIDE
‪#define WIDOWS_WINE_ELEMENTAL_SPEED_OVERRIDE
Definition: _zm_perk_widows_wine.gsh:36
‪widows_wine_damage_callback
‪function widows_wine_damage_callback(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime)
Definition: _zm_perk_widows_wine.gsc:282
‪WIDOWS_WINE_MACHINE_DISABLED_MODEL
‪#define WIDOWS_WINE_MACHINE_DISABLED_MODEL
Definition: _zm_perk_widows_wine.gsh:7
‪WIDOWS_WINE_FX_WRAP
‪#define WIDOWS_WINE_FX_WRAP
Definition: _zm_perk_widows_wine.gsh:28
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪melee_weapon_show
‪function melee_weapon_show(player)
Definition: _zm_melee_weapon.gsc:560
‪widows_wine_vehicle_behavior
‪function widows_wine_vehicle_behavior(attacker, weapon)
Definition: _zm_perk_widows_wine.gsc:558
‪create_and_play_dialog
‪function create_and_play_dialog(category, subcategory, force_variant)
Definition: _zm_audio.gsc:603
‪register_perk_damage_override_func
‪function register_perk_damage_override_func(func_damage_override)
Definition: _zm_perks.gsc:2028
‪set_player_lethal_grenade
‪function set_player_lethal_grenade(weapon)
Definition: _zm_utility.gsc:4180
‪WIDOWS_WINE_GRENADE
‪#define WIDOWS_WINE_GRENADE
Definition: _zm_perk_widows_wine.gsh:10
‪set_player_melee_weapon
‪function set_player_melee_weapon(weapon)
Definition: _zm_utility.gsc:4374
‪WW_MELEE_COCOON_CHANCE
‪#define WW_MELEE_COCOON_CHANCE
Definition: _zm_perk_widows_wine.gsc:218
‪WIDOWS_WINE_COCOON_FRACTION
‪#define WIDOWS_WINE_COCOON_FRACTION
Definition: _zm_perk_widows_wine.gsh:18