‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm_weap_cymbal_monkey.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\laststand_shared;
4 #using scripts\shared\math_shared;
5 #using scripts\shared\util_shared;
6 
7 #insert scripts\shared\shared.gsh;
8 
9 #using scripts\zm\_zm_clone;
10 #using scripts\zm\_zm_laststand;
11 #using scripts\zm\_zm_utility;
12 #using scripts\zm\_zm_weapons;
13 
14 #precache( "fx", "zombie/fx_cymbal_monkey_light_zmb" );
15 #precache( "fx", "zombie/fx_monkey_lightning_zmb" );
16 #precache( "fx", "dlc3/stalingrad/fx_cymbal_monkey_radial_pulse" );
17 
18 #using_animtree( "zombie_cymbal_monkey" );
19 
20 #define VALID_POI_MAX_RADIUS 200
21 #define VALID_POI_HALF_HEIGHT 100
22 #define VALID_POI_INNER_SPACING 2
23 #define VALID_POI_RADIUS_FROM_EDGES 15
24 #define VALID_POI_HEIGHT 36
25 
26 #define N_MONKEY_PULSE_RADIUS 128
27 #define N_MONKEY_PULSE_DAMAGE_MAX 1000
28 #define N_MONKEY_PULSE_DAMAGE_MIN 500
29 
30 
31 function ‪init()
32 {
33  level.weaponZMCymbalMonkey = GetWeapon( "cymbal_monkey" );
35 
36  if( !‪cymbal_monkey_exists( level.weaponZMCymbalMonkey ) )
37  {
38  return;
39  }
40 
41  level.w_cymbal_monkey_upgraded = GetWeapon( "cymbal_monkey_upgraded" );
42  if( ‪cymbal_monkey_exists( level.w_cymbal_monkey_upgraded) )
43  {
45  level._effect["monkey_bass"] = "dlc3/stalingrad/fx_cymbal_monkey_radial_pulse";
46  }
47 
48  if (‪IS_TRUE(level.legacy_cymbal_monkey))
49  {
50  level.cymbal_monkey_model = "weapon_zombie_monkey_bomb";
51  }
52  else
53  {
54  level.cymbal_monkey_model = "wpn_t7_zmb_monkey_bomb_world";
55  }
56 
57  level._effect["monkey_glow"] = "zombie/fx_cymbal_monkey_light_zmb";
58  level._effect["grenade_samantha_steal"] = "zombie/fx_monkey_lightning_zmb";
59 
60  level.cymbal_monkeys = [];
61 
62  if ( !IsDefined( level.valid_poi_max_radius ) )
63  {
64  level.valid_poi_max_radius = ‪VALID_POI_MAX_RADIUS;
65  }
66 
67  if ( !IsDefined( level.valid_poi_half_height ) )
68  {
69  level.valid_poi_half_height = ‪VALID_POI_HALF_HEIGHT;
70  }
71 
72  if ( !IsDefined( level.valid_poi_inner_spacing ) )
73  {
74  level.valid_poi_inner_spacing = ‪VALID_POI_INNER_SPACING;
75  }
76 
77  if ( !IsDefined( level.valid_poi_radius_from_edges ) )
78  {
79  level.valid_poi_radius_from_edges = ‪VALID_POI_RADIUS_FROM_EDGES;
80  }
81 
82  if ( !IsDefined( level.valid_poi_height ) )
83  {
84  level.valid_poi_height = ‪VALID_POI_HEIGHT;
85  }
86 }
87 
89 {
90  self giveweapon( level.weaponZMCymbalMonkey );
91  self ‪zm_utility::set_player_tactical_grenade( level.weaponZMCymbalMonkey );
92  self thread ‪player_handle_cymbal_monkey();
93 }
94 
96 {
97  // end any existing loop that gives infinite tactical ammo, or it will override the new weapon
98 
99  if ( isdefined( self ‪zm_utility::get_player_tactical_grenade() ) )
100  {
101  self TakeWeapon( self ‪zm_utility::get_player_tactical_grenade() ); // PORTIZ: was not correctly replacing the regular monkeys until they were manually taken
102  }
103 
104  self giveweapon( level.w_cymbal_monkey_upgraded );
105  self ‪zm_utility::set_player_tactical_grenade( level.w_cymbal_monkey_upgraded );
106  self thread ‪player_handle_cymbal_monkey();
107 }
108 
109 
111 {
112  self notify( "starting_monkey_watch" );
113  self endon( "disconnect" );
114  self endon( "starting_monkey_watch" );
115 
116  // Min distance to attract positions
117  attract_dist_diff = level.monkey_attract_dist_diff;
118  if( !isDefined( attract_dist_diff ) )
119  {
120  attract_dist_diff = 45;
121  }
122 
123  num_attractors = level.num_monkey_attractors;
124  if( !isDefined( num_attractors ) )
125  {
126  num_attractors = 96;
127  }
128 
129  max_attract_dist = level.monkey_attract_dist;
130  if( !isDefined( max_attract_dist ) )
131  {
132  max_attract_dist = 1536;
133  }
134 
135  while( true )
136  {
137  grenade = ‪get_thrown_monkey();
138  self ‪player_throw_cymbal_monkey(grenade,num_attractors,max_attract_dist,attract_dist_diff);
140  }
141 }
142 
143 function ‪watch_for_dud(model,actor)
144 {
145  self endon("death");
146  self waittill("grenade_dud");
147  model.dud = 1;
148  self playsound( "zmb_vox_monkey_scream" );
149  self.monk_scream_vox = true;
150  wait 3;
151  if(isdefined(model))
152  model delete();
153  if(isdefined(actor))
154  actor delete();
155  if (isdefined(self.damagearea))
156  self.damagearea delete();
157  if(isdefined(self))
158  self delete();
159 }
160 
161 function ‪watch_for_emp(model,actor)
162 {
163  self endon("death");
165  return;
166  while (1)
167  {
168  level waittill("emp_detonate",origin,radius);
169  if ( DistanceSquared( origin, self.origin) < radius * radius )
170  {
171  break;
172  }
173  }
174  self.stun_fx = true;
175  if (isdefined(level._equipment_emp_destroy_fx))
176  {
177  PlayFX( level._equipment_emp_destroy_fx, self.origin + ( 0, 0, 5 ) , ( 0, RandomFloat( 360 ), 0 ) );
178  }
179  wait 0.15;
180  self.attract_to_origin = false;
182  model ClearAnim( %o_monkey_bomb, 0 );
183  wait 1;
184  self Detonate();
185  wait 1;
186  if(isdefined(model))
187  model delete();
188  if(isdefined(actor))
189  actor delete();
190  if (isdefined(self.damagearea))
191  self.damagearea delete();
192  if(isdefined(self))
193  self delete();
194 }
195 
196 
197 function ‪clone_player_angles(owner)
198 {
199  self endon( "death" );
200  owner endon( "death" );
201  while (isdefined(self))
202  {
203  self.angles = owner.angles;
205  }
206 }
207 
208 
209 function ‪show_briefly( showtime )
210 {
211  self endon("show_owner");
212  if (isdefined(self.show_for_time))
213  {
214  self.show_for_time = showtime;
215  return;
216  }
217  self.show_for_time = showtime;
218  self SetVisibleToAll();
219  while ( self.show_for_time > 0 )
220  {
221  self.show_for_time -= 0.05;
223  }
224  self SetVisibleToAllExceptTeam( level.zombie_team );
225  self.show_for_time = undefined;
226 }
227 
228 
229 function ‪show_owner_on_attack( owner )
230 {
231  owner endon("hide_owner");
232  owner endon("show_owner");
233  self endon( "explode" );
234  self endon( "death" );
235  self endon( "grenade_dud" );
236 
237  owner.show_for_time = undefined;
238 
239  for( ;; )
240  {
241  owner waittill( "weapon_fired" );
242  owner thread ‪show_briefly(0.5);
243  }
244 }
245 
246 
247 function ‪hide_owner( owner )
248 {
249  owner notify("hide_owner");
250  owner endon("hide_owner");
251 
252  owner SetPerk("specialty_immunemms");
253  owner.no_burning_sfx = true;
254  owner notify( "stop_flame_sounds" );
255  owner SetVisibleToAllExceptTeam( level.zombie_team );
256 
257  owner.hide_owner = true;
258 
259  if (isdefined(level._effect[ "human_disappears" ]))
260  PlayFX( level._effect[ "human_disappears" ], owner.origin );
261 
262  self thread ‪show_owner_on_attack( owner );
263 
264  evt = self ‪util::waittill_any_ex( "explode", "death", "grenade_dud", owner, "hide_owner" );
265 
266 
267  owner notify("show_owner");
268 
269  owner UnsetPerk("specialty_immunemms");
270  if (isdefined(level._effect[ "human_disappears" ]))
271  PlayFX( level._effect[ "human_disappears" ], owner.origin );
272  owner.no_burning_sfx = undefined;
273  owner SetVisibleToAll();
274 
275  owner.hide_owner = undefined;
276 
277  owner Show();
278 }
279 
280 #define PLAYER_RADIUS 15.0
281 
282 function ‪proximity_detonate( owner )
283 {
284  //self endon("death");
285  wait 1.5; // so it can't be used as a simple proximity grenade
286  if ( !isdefined(self) )
287  return;
288 
289  detonateRadius = 96;
290  explosionRadius = detonateRadius * 2;
291 
292  damagearea = ‪spawn( "trigger_radius", self.origin + (0,0,0 - detonateRadius), ‪SPAWNFLAG_TRIGGER_AI_NEUTRAL, detonateRadius, detonateRadius * 1.5 );
293 
294  damagearea SetExcludeTeamForTrigger( owner.team );
295 
296  damagearea enablelinkto();
297  damagearea linkto( self );
298 
299  self.damagearea = damagearea;
300 
301  while ( isdefined(self) )
302  {
303  damagearea waittill( "trigger", ent );
304 
305  if ( isdefined( owner ) && ent == owner )
306  continue;
307 
308  if( isDefined( ent.team ) && ent.team == owner.team )
309  continue;
310 
311  self playsound ("wpn_claymore_alert");
312 
313  dist = Distance( self.origin, ent.origin );
314 
315  RadiusDamage(self.origin + (0,0,12),explosionRadius,1,1,owner,"MOD_GRENADE_SPLASH",level.weaponZMCymbalMonkey);
316 
317  if ( isdefined( owner ) )
318  self ‪detonate( owner );
319  else
320  self ‪detonate( undefined );
321 
322  break;
323  }
324 
325  if (isdefined(damagearea))
326  damagearea delete();
327 }
328 
329 // hack because grenades can't linkto
330 function ‪FakeLinkto(linkee)
331 {
332  self notify("fakelinkto");
333  self endon("fakelinkto");
334  self.backlinked = 1;
335  while (isdefined(self) && isdefined(linkee))
336  {
337  self.origin = linkee.origin;
338  self.angles = linkee.angles;
339  wait 0.05;
340  }
341 }
342 
343 
344 function ‪player_throw_cymbal_monkey(grenade,num_attractors,max_attract_dist,attract_dist_diff)
345 {
346  self endon( "disconnect" );
347  self endon( "starting_monkey_watch" );
348 
349  if( IsDefined( grenade ) )
350  {
351  grenade endon( "death" );
352 
354  {
355  if (isdefined(grenade.damagearea))
356  grenade.damagearea delete();
357  grenade delete();
358  return;
359  }
360  grenade hide();
361  model = ‪spawn( "script_model", grenade.origin );
362  model SetModel( level.cymbal_monkey_model );
363  model UseAnimTree( #animtree );
364  model linkTo( grenade );
365  model.angles = grenade.angles;
366  model thread ‪monkey_cleanup( grenade );
367 
368  clone = undefined;
369 
370  if (‪IS_TRUE(level.cymbal_monkey_dual_view))
371  {
372  model SetVisibleToAllExceptTeam( level.zombie_team );
373 
374  // level.cymbal_monkey_clone_weapon may be undefined
375  clone = ‪zm_clone::spawn_player_clone( self, (0,0,-999), level.cymbal_monkey_clone_weapon, undefined );
376  model.simulacrum = clone;
377  clone ‪zm_clone::clone_animate( "idle" );
378  clone thread ‪clone_player_angles( self );
379  clone notsolid();
380  clone ghost();
381  }
382 
383  grenade thread ‪watch_for_dud(model,clone);
384  grenade thread ‪watch_for_emp(model,clone);
385 
386  info = spawnStruct();
387  info.sound_attractors = [];
388  //grenade thread monitor_zombie_groans( info );
389 
390  grenade waittill("stationary");
391 
392  if ( IsDefined(level.grenade_planted) )
393  {
394  self thread [[level.grenade_planted]](grenade,model);
395  }
396 
397  if( isDefined( grenade ) )
398  {
399  grenade.ground_ent = grenade GetGroundEnt();
400 
401  if (isdefined(model))
402  {
403  if ( isdefined(grenade.ground_ent) && !( grenade.ground_ent.classname === "worldspawn" ) )
404  {
405  model SetMovingPlatformEnabled( true );
406  model LinkTo( grenade.ground_ent );
407  grenade thread ‪FakeLinkto(model);
408  }
409  else if (!‪IS_TRUE(grenade.backlinked))
410  {
411  model unlink();
412  model.origin = grenade.origin;
413  model.angles = grenade.angles;
414  }
415  //temp wait until we figure out why animscripted cannot be called right after unlink over here
416  wait 0.1;
417  model AnimScripted( "cymbal_monkey_anim", grenade.origin, grenade.angles, %o_monkey_bomb );
418  }
419  if (isdefined(clone))
420  {
421  clone ForceTeleport( grenade.origin, grenade.angles );
422  clone thread ‪hide_owner( self );
423  grenade thread ‪proximity_detonate( self );
424  clone show();
425  clone SetInvisibleToAll();
426  clone SetVisibleToTeam(level.zombie_team);
427  }
428 
429  grenade resetmissiledetonationtime();
430  PlayFxOnTag( level._effect["monkey_glow"], model, "tag_origin_animate" );
431 
432  valid_poi = ‪zm_utility::check_point_in_enabled_zone( grenade.origin, undefined, undefined );
433 
434  if ( ‪IS_TRUE( level.move_valid_poi_to_navmesh ) )
435  {
436  valid_poi = grenade ‪move_valid_poi_to_navmesh( valid_poi );
437  }
438 
439  if ( isdefined( level.check_valid_poi ) )
440  {
441  valid_poi = grenade [[ level.check_valid_poi ]]( valid_poi );
442  }
443 
444  if(valid_poi)
445  {
446  grenade ‪zm_utility::create_zombie_point_of_interest( max_attract_dist, num_attractors, 10000 );
447  grenade.attract_to_origin = true;
448 
449  grenade thread ‪zm_utility::create_zombie_point_of_interest_attractor_positions( 4, attract_dist_diff );
451 
452  if ( grenade.weapon == level.w_cymbal_monkey_upgraded )
453  {
454  grenade thread ‪pulse_damage( self, model );
455  }
456  grenade thread ‪do_monkey_sound( model, info );
457 
458  level.cymbal_monkeys[ level.cymbal_monkeys.size ] = grenade;
459  }
460  else
461  {
462  grenade.script_noteworthy = undefined;
463  level thread ‪grenade_stolen_by_sam( grenade, model, clone );
464  }
465  }
466  else
467  {
468  grenade.script_noteworthy = undefined;
469  level thread ‪grenade_stolen_by_sam( grenade, model, clone );
470  }
471  }
472 }
473 
474 function ‪move_valid_poi_to_navmesh( valid_poi )
475 {
476  if ( !‪IS_TRUE( valid_poi ) )
477  {
478  return false;
479  }
480 
481  if ( IsPointOnNavMesh( self.origin ) )
482  {
483  return true;
484  }
485 
486  v_orig = self.origin;
487  queryResult = PositionQuery_Source_Navigation(
488  self.origin, // origin
489  0, // min radius
490  level.valid_poi_max_radius, // max radius
491  level.valid_poi_half_height, // half height
492  level.valid_poi_inner_spacing, // inner spacing
493  level.valid_poi_radius_from_edges // radius from edges
494  );
495 
496  if ( queryResult.data.size )
497  {
498  foreach ( point in queryResult.data )
499  {
500  height_offset = abs( self.origin[2] - point.origin[2] );
501  if ( height_offset > level.valid_poi_height )
502  {
503  continue;
504  }
505 
506  if ( BulletTracePassed( point.origin + ( 0, 0, 20 ), v_orig + ( 0, 0, 20 ), false, self, undefined, false, false ) )
507  {
508  self.origin = point.origin;
509  return true;
510  }
511  }
512  }
513 
514  return false;
515 }
516 
517 // if the player throws it to an unplayable area samantha steals it
518 function ‪grenade_stolen_by_sam( ent_grenade, ent_model, ent_actor )
519 {
520  if( !IsDefined( ent_model ) )
521  {
522  return;
523  }
524 
525  //ent_grenade notify( "sam_stole_it" );
526 
527  direction = ent_model.origin;
528  direction = (direction[1], direction[0], 0);
529 
530  if(direction[1] < 0 || (direction[0] > 0 && direction[1] > 0))
531  {
532  direction = (direction[0], direction[1] * -1, 0);
533  }
534  else if(direction[0] < 0)
535  {
536  direction = (direction[0] * -1, direction[1], 0);
537  }
538 
539  // Play laugh sound here, players should connect the laugh with the movement which will tell the story of who is moving it
540  players = GetPlayers();
541  for( i = 0; i < players.size; i++ )
542  {
543  if( IsAlive( players[i] ) )
544  {
545  players[i] playlocalsound( level.zmb_laugh_alias );
546  }
547  }
548 
549  // play the fx on the model
550  PlayFXOnTag( level._effect[ "grenade_samantha_steal" ], ent_model, "tag_origin" );
551 
552  ent_model StopAnimScripted();
553 
554  // raise the model
555  ent_model MoveZ( 60, 1.0, 0.25, 0.25 );
556 
557  // spin it
558  ent_model Vibrate( direction, 1.5, 2.5, 1.0 );
559  ent_model waittill( "movedone" );
560 
561  if (isdefined(self.damagearea))
562  self.damagearea delete();
563 
564  // delete it
565  ent_model Delete();
566 
567  if(isDefined(ent_actor))
568  {
569  ent_actor Delete();
570  }
571 
572  if ( isdefined( ent_grenade ) )
573  {
574  if (isdefined(ent_grenade.damagearea))
575  ent_grenade.damagearea delete();
576  ent_grenade Delete();
577  }
578 }
579 
580 function ‪monkey_cleanup( parent )
581 {
582  while( true )
583  {
584  if( !isDefined( parent ) )
585  {
586  if (isdefined(self) && ‪IS_TRUE(self.dud)) // wait for the screams to die out
587  wait 6;
588  if (isdefined(self.simulacrum))
589  self.simulacrum delete();
591  return;
592  }
594  }
595 }
596 
597 
598 function ‪pulse_damage( e_owner, model )
599 {
600  self endon( "explode" );
601 
602  ‪util::wait_network_frame(); // space out from monkey_glow FX play
603  PlayFxOnTag( level._effect["monkey_bass"], model, "tag_origin_animate" );
604 
605  n_damage_origin = self.origin + ( 0, 0, 12 );
606 
607  while ( true )
608  {
609  a_ai_targets = GetAITeamArray( "axis" );
610 
611  foreach( ai_target in a_ai_targets )
612  {
613  if ( isdefined( ai_target ) )
614  {
615  n_distance_to_target = Distance( ai_target.origin, n_damage_origin );
616 
617  if ( n_distance_to_target > ‪N_MONKEY_PULSE_RADIUS )
618  {
619  continue;
620  }
621 
623 
624  ai_target DoDamage( n_damage, ai_target.origin, e_owner, self, "none", "MOD_GRENADE_SPLASH", 0, level.w_cymbal_monkey_upgraded );
625  }
626  }
627 
628  wait 1.0;
629  }
630 }
631 
632 
633 function ‪do_monkey_sound( model, info )
634 {
635  self.monk_scream_vox = false;
636 
637  if (isdefined(level.grenade_safe_to_bounce))
638  {
639  if (![[level.grenade_safe_to_bounce]](self.owner,level.weaponZMCymbalMonkey))
640  {
641  self playsound( "zmb_vox_monkey_scream" );
642  self.monk_scream_vox = true;
643  }
644  }
645 
646  if (isdefined(level.monkey_song_override))
647  {
648  if ([[level.monkey_song_override]](self.owner,level.weaponZMCymbalMonkey))
649  {
650  self playsound( "zmb_vox_monkey_scream" );
651  self.monk_scream_vox = true;
652  }
653  }
654 
655 /*
656  if( isdefined( level.lava ) )
657  {
658  for ( i=0; i<level.lava.size; i++ )
659  {
660  if ( self IsTouching(level.lava[i]) )
661  {
662  self playsound( "zmb_vox_monkey_scream" );
663  monk_scream_vox = true;
664  break;
665  }
666  }
667  }
668 */
669 
670  if( !self.monk_scream_vox && level.musicSystem.currentPlaytype < 4 )
671  {
672  if (‪IS_TRUE(level.cymbal_monkey_dual_view))
673  self playsoundtoteam( "zmb_monkey_song", "allies" );
674  else if( self.weapon.name == "cymbal_monkey_upgraded" )
675  self playsound( "zmb_monkey_song_upgraded" );
676  else
677  self playsound( "zmb_monkey_song" );
678  }
679 
680  if( !self.monk_scream_vox )
681  self thread ‪play_delayed_explode_vox();
682 
683  self waittill( "explode", position );
684  level notify("grenade_exploded",position,100,5000,450);
685 
686  monkey_index = -1;
687  for ( i = 0; i < level.cymbal_monkeys.size; i++ )
688  {
689  if ( !isdefined( level.cymbal_monkeys[i] ) )
690  {
691  monkey_index = i;
692  break;
693  }
694  }
695  if ( monkey_index >= 0 )
696  {
697  ArrayRemoveIndex( level.cymbal_monkeys, monkey_index );
698  }
699 
700  if( isDefined( model ) )
701  {
702  model ClearAnim( %o_monkey_bomb, 0.2 );
703  }
704 
705  for( i = 0; i < info.sound_attractors.size; i++ )
706  {
707  if( isDefined( info.sound_attractors[i] ) )
708  {
709  info.sound_attractors[i] notify( "monkey_blown_up" );
710  }
711  }
712 }
713 
715 {
716  wait(6.5);
717  if(isdefined( self ) )
718  {
719  if( self.weapon.name == "cymbal_monkey_upgraded" )
720  {
721  self playsound( "zmb_vox_monkey_explode_upgraded" );
722  }
723  else
724  {
725  self playsound( "zmb_vox_monkey_explode" );
726  }
727  }
728 }
729 
731 {
732  self endon( "disconnect" );
733  self endon( "starting_monkey_watch" );
734 
735  while( true )
736  {
737  self waittill( "grenade_fire", grenade, weapon );
738  if( weapon == level.weaponZMCymbalMonkey || weapon == level.w_cymbal_monkey_upgraded )
739  {
740  grenade.use_grenade_special_long_bookmark = true;
741  grenade.grenade_multiattack_bookmark_count = 1;
742  grenade.weapon = weapon;
743  return grenade;
744  }
745 
747  }
748 }
749 
750 function ‪monitor_zombie_groans( info )
751 {
752  self endon( "explode" );
753 
754  while( true )
755  {
756  if( !isDefined( self ) )
757  {
758  return;
759  }
760 
761  if( !isDefined( self.attractor_array ) )
762  {
764  continue;
765  }
766 
767  for( i = 0; i < self.attractor_array.size; i++ )
768  {
769  if( !IsInArray( info.sound_attractors, self.attractor_array[i] ) )
770  {
771  if ( isDefined( self.origin ) && isDefined( self.attractor_array[i].origin ) )
772  {
773  if( distanceSquared( self.origin, self.attractor_array[i].origin ) < 500 * 500 )
774  {
775  ‪ARRAY_ADD( info.sound_attractors, self.attractor_array[i] );
776  self.attractor_array[i] thread ‪play_zombie_groans();
777  }
778  }
779  }
780  }
782  }
783 }
784 
786 {
787  self endon( "death" );
788  self endon( "monkey_blown_up" );
789 
790  while(1)
791  {
792  if( isdefined ( self ) )
793  {
794  self playsound( "zmb_vox_zombie_groan" );
795  wait randomfloatrange( 2, 3 );
796  }
797  else
798  {
799  return;
800  }
801  }
802 }
803 
804 function ‪cymbal_monkey_exists( w_weapon )
805 {
806  return ‪zm_weapons::is_weapon_included( w_weapon );
807 }
808 
‪player_handle_cymbal_monkey
‪function player_handle_cymbal_monkey()
Definition: _zm_weap_cymbal_monkey.gsc:110
‪play_delayed_explode_vox
‪function play_delayed_explode_vox()
Definition: _zm_weap_cymbal_monkey.gsc:714
‪watch_for_emp
‪function watch_for_emp(model, actor)
Definition: _zm_weap_cymbal_monkey.gsc:161
‪get_thrown_monkey
‪function get_thrown_monkey()
Definition: _zm_weap_cymbal_monkey.gsc:730
‪player_give_cymbal_monkey
‪function player_give_cymbal_monkey()
Definition: _zm_weap_cymbal_monkey.gsc:88
‪move_valid_poi_to_navmesh
‪function move_valid_poi_to_navmesh(valid_poi)
Definition: _zm_weap_cymbal_monkey.gsc:474
‪N_MONKEY_PULSE_DAMAGE_MAX
‪#define N_MONKEY_PULSE_DAMAGE_MAX
Definition: _zm_weap_cymbal_monkey.gsc:27
‪watch_for_dud
‪function watch_for_dud(model, actor)
Definition: _zm_weap_cymbal_monkey.gsc:143
‪grenade_stolen_by_sam
‪function grenade_stolen_by_sam(ent_grenade, ent_model, ent_actor)
Definition: _zm_weap_cymbal_monkey.gsc:518
‪create_zombie_point_of_interest
‪function create_zombie_point_of_interest(attract_dist, num_attractors, added_poi_value, start_turned_on, initial_attract_func, arrival_attract_func, poi_team)
Definition: _zm_utility.gsc:624
‪clone_player_angles
‪function clone_player_angles(owner)
Definition: _zm_weap_cymbal_monkey.gsc:197
‪detonate
‪function detonate(attacker)
Definition: vehicle_ai_shared.gsc:1650
‪VALID_POI_HEIGHT
‪#define VALID_POI_HEIGHT
Definition: _zm_weap_cymbal_monkey.gsc:24
‪clone_animate
‪function clone_animate(animtype)
Definition: _zm_clone.gsc:118
‪VALID_POI_RADIUS_FROM_EDGES
‪#define VALID_POI_RADIUS_FROM_EDGES
Definition: _zm_weap_cymbal_monkey.gsc:23
‪self_delete
‪function self_delete()
Definition: _util.gsc:739
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪check_point_in_enabled_zone
‪function check_point_in_enabled_zone(origin, zone_is_active, player_zones)
Definition: _zm_utility.gsc:512
‪is_weapon_included
‪function is_weapon_included(weapon)
Definition: _zm_weapons.csc:51
‪spawn_player_clone
‪function spawn_player_clone(player, animname)
Definition: util_shared.gsc:2049
‪monkey_cleanup
‪function monkey_cleanup(parent)
Definition: _zm_weap_cymbal_monkey.gsc:580
‪SPAWNFLAG_TRIGGER_AI_NEUTRAL
‪#define SPAWNFLAG_TRIGGER_AI_NEUTRAL
Definition: shared.gsh:31
‪player_give_cymbal_monkey_upgraded
‪function player_give_cymbal_monkey_upgraded()
Definition: _zm_weap_cymbal_monkey.gsc:95
‪linear_map
‪function linear_map(num, min_a, max_a, min_b, max_b)
Definition: math_shared.csc:43
‪init
‪function init()
Definition: _zm_weap_cymbal_monkey.gsc:31
‪wait_for_attractor_positions_complete
‪function wait_for_attractor_positions_complete()
Definition: _zm_utility.gsc:5941
‪waittill_any_ex
‪function waittill_any_ex(...)
Definition: util_shared.csc:270
‪wait_network_frame
‪function wait_network_frame(n_count=1)
Definition: util_shared.gsc:64
‪set_player_tactical_grenade
‪function set_player_tactical_grenade(weapon)
Definition: _zm_utility.gsc:4250
‪pulse_damage
‪function pulse_damage(e_owner, model)
Definition: _zm_weap_cymbal_monkey.gsc:598
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪create_zombie_point_of_interest_attractor_positions
‪function create_zombie_point_of_interest_attractor_positions(num_attract_dists, attract_dist)
Definition: _zm_utility.gsc:717
‪register_zombie_weapon_callback
‪function register_zombie_weapon_callback(weapon, func)
Definition: _zm_weapons.gsc:3317
‪player_throw_cymbal_monkey
‪function player_throw_cymbal_monkey(grenade, num_attractors, max_attract_dist, attract_dist_diff)
Definition: _zm_weap_cymbal_monkey.gsc:344
‪show_briefly
‪function show_briefly(showtime)
Definition: _zm_weap_cymbal_monkey.gsc:209
‪should_watch_for_emp
‪function should_watch_for_emp()
Definition: _zm_utility.gsc:4466
‪monitor_zombie_groans
‪function monitor_zombie_groans(info)
Definition: _zm_weap_cymbal_monkey.gsc:750
‪get_player_tactical_grenade
‪function get_player_tactical_grenade()
Definition: _zm_utility.gsc:4237
‪VALID_POI_MAX_RADIUS
‪#define VALID_POI_MAX_RADIUS
Definition: _zm_weap_cymbal_monkey.gsc:20
‪do_monkey_sound
‪function do_monkey_sound(model, info)
Definition: _zm_weap_cymbal_monkey.gsc:633
‪player_is_in_laststand
‪function player_is_in_laststand()
Definition: laststand_shared.gsc:18
‪VALID_POI_HALF_HEIGHT
‪#define VALID_POI_HALF_HEIGHT
Definition: _zm_weap_cymbal_monkey.gsc:21
‪N_MONKEY_PULSE_DAMAGE_MIN
‪#define N_MONKEY_PULSE_DAMAGE_MIN
Definition: _zm_weap_cymbal_monkey.gsc:28
‪N_MONKEY_PULSE_RADIUS
‪#define N_MONKEY_PULSE_RADIUS
Definition: _zm_weap_cymbal_monkey.gsc:26
‪hide_owner
‪function hide_owner(owner)
Definition: _zm_weap_cymbal_monkey.gsc:247
‪FakeLinkto
‪function FakeLinkto(linkee)
Definition: _zm_weap_cymbal_monkey.gsc:330
‪proximity_detonate
‪function proximity_detonate(owner)
Definition: _zm_weap_cymbal_monkey.gsc:282
‪show_owner_on_attack
‪function show_owner_on_attack(owner)
Definition: _zm_weap_cymbal_monkey.gsc:229
‪VALID_POI_INNER_SPACING
‪#define VALID_POI_INNER_SPACING
Definition: _zm_weap_cymbal_monkey.gsc:22
‪cymbal_monkey_exists
‪function cymbal_monkey_exists(w_weapon)
Definition: _zm_weap_cymbal_monkey.gsc:804
‪play_zombie_groans
‪function play_zombie_groans()
Definition: _zm_weap_cymbal_monkey.gsc:785
‪deactivate_zombie_point_of_interest
‪function deactivate_zombie_point_of_interest(dont_remove)
Definition: _zm_utility.gsc:1030
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265