‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_proximity_grenade.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\challenges_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\scoreevents_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\weapons\_weaponobjects;
9 #using scripts\shared\util_shared;
10 
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\version.gsh;
13 
14 #precache( "fx", "weapon/fx_prox_grenade_scan_blue" );
15 #precache( "fx", "weapon/fx_prox_grenade_wrn_grn" );
16 #precache( "fx", "weapon/fx_prox_grenade_scan_orng" );
17 #precache( "fx", "weapon/fx_prox_grenade_wrn_red" );
18 #precache( "fx", "weapon/fx_prox_grenade_impact_player_spwner" );
19 #precache( "fx", "weapon/fx_prox_grenade_elec_jump" );
20 
21 #namespace proximity_grenade;
22 
23 function ‪init_shared()
24 {
25  level._effect["prox_grenade_friendly_default"] = "weapon/fx_prox_grenade_scan_blue";
26  level._effect["prox_grenade_friendly_warning"] = "weapon/fx_prox_grenade_wrn_grn";
27  level._effect["prox_grenade_enemy_default"] = "weapon/fx_prox_grenade_scan_orng";
28  level._effect["prox_grenade_enemy_warning"] = "weapon/fx_prox_grenade_wrn_red";
29  level._effect["prox_grenade_player_shock"] = "weapon/fx_prox_grenade_impact_player_spwner";
30  level._effect["prox_grenade_chain_bolt"] = "weapon/fx_prox_grenade_elec_jump";
31 
32  level.proximityGrenadeDetectionRadius = GetDvarInt( "scr_proximityGrenadeDetectionRadius", 180 );
33  level.proximityGrenadeDuration = GetDvarFloat( "scr_proximityGrenadeDuration", 1.2 );
34  level.proximityGrenadeGracePeriod = GetDvarFloat( "scr_proximityGrenadeGracePeriod", 0.05 );
35  level.proximityGrenadeDOTDamageAmount = GetDvarInt( "scr_proximityGrenadeDOTDamageAmount", 1 );
36  level.proximityGrenadeDOTDamageAmountHardcore = GetDvarInt( "scr_proximityGrenadeDOTDamageAmountHardcore", 1 );
37  level.proximityGrenadeDOTDamageTime = GetDvarFloat( "scr_proximityGrenadeDOTDamageTime", 0.2 );
38  level.proximityGrenadeDOTDamageInstances = GetDvarInt( "scr_proximityGrenadeDOTDamageInstances", 4 );
39  level.proximityGrenadeActivationTime = GetDvarFloat( "scr_proximityGrenadeActivationTime", .1 );
40  level.proximityChainDebug = GetDvarInt( "scr_proximityChainDebug", 0 );
41  level.proximityChainGracePeriod = GetDvarInt( "scr_proximityChainGracePeriod", 2500 );
42  level.proximityChainBoltSpeed = GetDvarFloat( "scr_proximityChainBoltSpeed", 400.0 );
43  level.proximityGrenadeProtectedTime = GetDvarFloat( "scr_proximityGrenadeProtectedTime", 0.45 );
44 
45  level.poisonFXDuration = 6;
46 
47  level thread register();
48 
50 
51  ‪callback::add_weapon_damage( GetWeapon( "proximity_grenade" ), &‪on_damage );
52 
53  /#
54  level thread ‪updateDvars();
55  #/
56 }
57 
58 //******************************************************************
59 // *s
60 // *
61 //******************************************************************
62 function register()
63 {
64  ‪clientfield::register( "toplayer", "tazered", ‪VERSION_SHIP, 1, "int" );
65 }
66 
67 function ‪updateDvars()
68 {
69  while(1)
70  {
71  level.proximityGrenadeDetectionRadius = GetDvarInt( "scr_proximityGrenadeDetectionRadius", level.proximityGrenadeDetectionRadius );
72  level.proximityGrenadeDuration = GetDvarFloat( "scr_proximityGrenadeDuration", 1.5 );
73  level.proximityGrenadeGracePeriod = GetDvarFloat( "scr_proximityGrenadeGracePeriod", level.proximityGrenadeGracePeriod );
74  level.proximityGrenadeDOTDamageAmount = GetDvarInt( "scr_proximityGrenadeDOTDamageAmount", level.proximityGrenadeDOTDamageAmount );
75  level.proximityGrenadeDOTDamageAmountHardcore = GetDvarInt( "scr_proximityGrenadeDOTDamageAmountHardcore", level.proximityGrenadeDOTDamageAmountHardcore );
76  level.proximityGrenadeDOTDamageTime = GetDvarFloat( "scr_proximityGrenadeDOTDamageTime", level.proximityGrenadeDOTDamageTime );
77  level.proximityGrenadeDOTDamageInstances = GetDvarInt( "scr_proximityGrenadeDOTDamageInstances", level.proximityGrenadeDOTDamageInstances );
78  level.proximityGrenadeActivationTime = GetDvarFloat( "scr_proximityGrenadeActivationTime", level.proximityGrenadeActivationTime );
79  level.proximityChainDebug = GetDvarInt( "scr_proximityChainDebug", level.proximityChainDebug );
80  level.proximityChainGracePeriod = GetDvarInt( "scr_proximityChainGracePeriod", level.proximityChainGracePeriod );
81  level.proximityChainBoltSpeed = GetDvarFloat( "scr_proximityChainBoltSpeed", level.proximityChainBoltSpeed );
82  level.proximityGrenadeProtectedTime = GetDvarFloat( "scr_proximityGrenadeProtectedTime", level.proximityGrenadeProtectedTime );
83 
84  wait(1.0);
85  }
86 }
87 
88 function ‪createProximityGrenadeWatcher() // self == player
89 {
90  watcher = self ‪weaponobjects::createProximityWeaponObjectWatcher( "proximity_grenade", self.team );
91  watcher.watchForFire = true;
92  watcher.hackable = true;
93  watcher.hackerToolRadius = level.equipmentHackerToolRadius;
94  watcher.hackerToolTimeMs = level.equipmentHackerToolTimeMs;
95  watcher.headIcon = false;
96  watcher.activateFx = true;
97  watcher.ownerGetsAssist = true;
98  watcher.ignoreDirection = true;
99  watcher.immediateDetonation = true;
100  watcher.detectionGracePeriod = level.proximityGrenadeGracePeriod;
101  watcher.detonateRadius = level.proximityGrenadeDetectionRadius;
102  watcher.onStun = &‪weaponobjects::weaponStun;
103  watcher.stunTime = 1;
104  watcher.onDetonateCallback =&‪proximityDetonate;
105  watcher.activationDelay = level.proximityGrenadeActivationTime;
106  watcher.activateSound = "wpn_claymore_alert";
107  watcher.immunespecialty = "specialty_immunetriggershock";
108 
109  watcher.onSpawn =&‪onSpawnProximityGrenadeWeaponObject;
110 }
111 
112 function ‪createGadgetProximityGrenadeWatcher() // self == player
113 {
114  watcher = self ‪weaponobjects::createProximityWeaponObjectWatcher( "gadget_sticky_proximity", self.team );
115  watcher.watchForFire = true;
116  watcher.hackable = true;
117  watcher.hackerToolRadius = level.equipmentHackerToolRadius;
118  watcher.hackerToolTimeMs = level.equipmentHackerToolTimeMs;
119  watcher.headIcon = false;
120  watcher.activateFx = true;
121  watcher.ownerGetsAssist = true;
122  watcher.ignoreDirection = true;
123  watcher.immediateDetonation = true;
124  watcher.detectionGracePeriod = level.proximityGrenadeGracePeriod;
125  watcher.detonateRadius = level.proximityGrenadeDetectionRadius;
126  watcher.onStun = &‪weaponobjects::weaponStun;
127  watcher.stunTime = 1;
128  watcher.onDetonateCallback =&‪proximityDetonate;
129  watcher.activationDelay = level.proximityGrenadeActivationTime;
130  watcher.activateSound = "wpn_claymore_alert";
131 
132  watcher.onSpawn =&‪onSpawnProximityGrenadeWeaponObject;
133 }
134 
135 function ‪onSpawnProximityGrenadeWeaponObject( watcher, owner ) // self == weapon object
136 {
137  self thread ‪setupKillCamEnt();
138  owner AddWeaponStat( self.weapon, "used", 1 );
139 
140  if ( IsDefined( self.weapon ) && self.weapon.proximityDetonation > 0 )
141  {
142  watcher.detonateRadius = self.weapon.proximityDetonation;
143  }
144 
146 
147  self ‪trackOnOwner( self.owner );
148 }
149 
150 function ‪trackOnOwner( owner )
151 {
152  if ( level.trackProximityGrenadesOnOwner === true )
153  {
154  if ( !isdefined( owner ) )
155  return;
156 
157  if ( !isdefined( owner.activeProximityGrenades ) )
158  {
159  owner.activeProximityGrenades = [];
160  }
161  else
162  {
163  ArrayRemoveValue( owner.activeProximityGrenades, undefined );
164  }
165 
166  owner.activeProximityGrenades[ owner.activeProximityGrenades.size ] = self;
167  }
168 }
169 
170 function ‪setupKillCamEnt() // self == grenade
171 {
172  self endon( "death" );
173 
175 
176  self.killCamEnt = ‪spawn( "script_model", self.origin + (0,0,8 ) );
177  self thread ‪cleanupKillCamEntOnDeath();
178 }
179 
180 function ‪cleanupKillCamEntOnDeath() // self == grenade
181 {
182  self waittill( "death" );
183 
184  self.killCamEnt ‪util::deleteAfterTime( 4 + level.proximityGrenadeDOTDamageTime * level.proximityGrenadeDOTDamageInstances );
185 }
186 
187 function ‪proximityDetonate( attacker, weapon, target )
188 {
189  if ( isdefined( weapon ) && weapon.isValid )
190  {
191  if ( isdefined( attacker ) )
192  {
193  if ( self.owner ‪util::IsEnemyPlayer( attacker ) )
194  {
195  attacker ‪challenges::destroyedExplosive( weapon );
196  ‪scoreevents::processScoreEvent( "destroyed_proxy", attacker, self.owner, weapon );
197  }
198  }
199  }
200 
201  ‪weaponobjects::weaponDetonate( attacker, weapon );
202 }
203 
204 function ‪proximityGrenadeDamagePlayer( eAttacker, eInflictor, killCamEnt, weapon, meansOfDeath, ‪damage, proximityChain )
205 {
206  // eAttacker is the owner of the charge
207  // eInflictor is originally the charge, and when on a chain, it;s the player that passed on the chain to us
208  // killCamEnt is the killCam placed at the charge
209  self thread ‪damagePlayerInRadius( eInflictor.origin, eAttacker, killCamEnt );
210 
211  if ( weapon.chainEventRadius > 0 && !self hasPerk ("specialty_proximityprotection") )
212  {
213  self thread ‪proximityGrenadeChain( eAttacker, eInflictor, killCamEnt, weapon, meansOfDeath, ‪damage, proximityChain, 0 );
214  }
215 }
216 
218 {
219  if ( !isdefined( level.proximityChains ) )
220  {
221  level.proximityChains = [];
222  }
223 
224  // we use level.proximityChains because we need them to survive players and the on_damage callback
225  foreach( chain in level.proximityChains )
226  {
227  if ( !‪chainIsActive( chain ) )
228  {
229  return chain;
230  }
231  }
232 
233  chain = spawnstruct();
234  level.proximityChains[level.proximityChains.size] = chain;
235 
236  return chain;
237 }
238 
239 function ‪chainIsActive( chain )
240 {
241  // a chain is active as long as it is still being used
242  if ( isdefined( chain.activeEndTime ) && chain.activeEndTime > GetTime() )
243  {
244  return true;
245  }
246 
247  return false;
248 }
249 
250 function ‪cleanUpProximityChainEnt() // self is a temp entity to keep track of the original chain. it goes away when all chains are finished.
251 {
252  self.cleanUp = true;
253 
254  any_active = true;
255 
256  while( any_active )
257  {
258  wait( 1 );
259 
260  if ( !isdefined( self ) )
261  {
262  return;
263  }
264 
265  any_active = false;
266 
267  foreach( proximityChain in self.chains )
268  {
269  if ( proximityChain.activeEndTime > GetTime() )
270  {
271  any_active = true;
272  break;
273  }
274  }
275  }
276 
277  if ( isdefined( self ) )
278  {
279  self delete();
280  }
281 }
282 
283 function ‪isInChain( player )
284 {
285  player_num = player GetEntityNumber();
286 
287  return isdefined( self.chain_players[player_num] );
288 }
289 
290 function ‪addPlayerToChain( player )
291 {
292  player_num = player GetEntityNumber();
293 
294  self.chain_players[player_num] = player;
295 }
296 
297 function ‪proximityGrenadeChain( eAttacker, eInflictor, killCamEnt, weapon, meansOfDeath, ‪damage, proximityChain, ‪delay )
298 {
299  self endon( "disconnect" );
300  self endon( "death" );
301 
302  eAttacker endon( "disconnect" );
303 
304  if ( !isdefined( proximityChain ) )
305  {
306  // this is a new chain started at the on_damage callback
307  proximityChain = ‪getProximityChain();
308  proximityChain.chainEventNum = 0;
309 
310  if ( !isdefined( eInflictor.proximityChainEnt ) )
311  {
312  // this is the first chain from proximity grenade explosion started at the on_damage callback
313  eInflictor.proximityChainEnt = ‪spawn( "script_origin", self.origin );
314  eInflictor.proximityChainEnt.chains = [];
315  eInflictor.proximityChainEnt.chain_players = [];
316  }
317 
318  proximityChain.proximityChainEnt = eInflictor.proximityChainEnt;
319  proximityChain.proximityChainEnt.chains[proximityChain.proximityChainEnt.chains.size] = proximityChain;
320  }
321 
322  proximityChain.chainEventNum += 1;
323 
324  if ( proximityChain.chainEventNum >= weapon.chainEventMax )
325  {
326  // this chain is maxed
327  return;
328  }
329 
330  chainEventRadiusSq = weapon.chainEventRadius * weapon.chainEventRadius;
331 
332  endTime = GetTime() + weapon.chainEventTime;
333 
334  proximityChain.proximityChainEnt ‪addPlayerToChain( self );
335  proximityChain.activeEndTime = endTime + (‪delay * 1000) + level.proximityChainGracePeriod; // allow an interval to avoid reusing this proximityChain, in case it's still being used.
336 
337  ‪if ( ‪delay > 0 )
338  {
339  // yield after incrementing chainEventNum, and updating the chain active state
340  wait( ‪delay );
341  }
342 
343  if( !isdefined( proximityChain.proximityChainEnt.cleanUp ) )
344  {
345  proximityChain.proximityChainEnt thread ‪cleanUpProximityChainEnt();
346  }
347 
348  // we just been chain shocked, we will look for other players to continue the chain
349  while( 1 )
350  {
351  currentTime = GetTime();
352 
353  if ( endTime < currentTime )
354  {
355  return;
356  }
357 
358  closestPlayers = ArraySort( level.players, self.origin, true );
359 
360  foreach( player in closestPlayers )
361  {
363 
364  if ( proximityChain.chainEventNum >= weapon.chainEventMax )
365  {
366  // this chain is maxed
367  return;
368  }
369 
370  if ( !isdefined( player ) || !IsAlive( player ) || player == self )
371  {
372  continue;
373  }
374 
375  if ( player.sessionstate != "playing" )
376  {
377  continue;
378  }
379 
380  distanceSq = DistanceSquared( player.origin, self.origin );
381 
382  if ( distanceSq > chainEventRadiusSq )
383  {
384  break;
385  }
386 
387  if ( proximityChain.proximityChainEnt ‪isInChain( player ) )
388  {
389  continue;
390  }
391 
392  if ( level.proximityChainDebug || ‪weaponobjects::friendlyFireCheck( eAttacker, player ) )
393  {
394  if ( level.proximityChainDebug || !player hasPerk ("specialty_proximityprotection") )
395  {
396  // found a player to pass the chain to
397 
398  self thread ‪chainPlayer( eAttacker, killCamEnt, weapon, meansOfDeath, ‪damage, proximityChain, player, distanceSq );
399  }
400  }
401  }
402 
404  }
405 }
406 
407 function ‪chainPlayer( eAttacker, killCamEnt, weapon, meansOfDeath, ‪damage, proximityChain, player, distanceSq )
408 {
409  waitTime = 0.25;
410 
411  speedSq = level.proximityChainBoltSpeed * level.proximityChainBoltSpeed;
412  if ( speedSq > 100 && distanceSq > 1 )
413  {
414  waitTime = distanceSq / speedSq;
415  }
416 
417  player thread ‪proximityGrenadeChain( eAttacker, self, killCamEnt, weapon, meansOfDeath, ‪damage, proximityChain, waitTime );
418 
420 
421  if ( level.proximityChainDebug )
422  {
423  /#
424  color = (1, 1, 1);
425  alpha = 1;
426  depth = 0;
427  time = 200;
428  ‪util::debug_line(self.origin + (0,0,50), player.origin + (0,0,50), color, alpha, depth, time );
429  #/
430  }
431 
432  self ‪tesla_play_arc_fx( player, waitTime );
433 
434  player thread ‪damagePlayerInRadius( self.origin, eAttacker, killCamEnt );
435 }
436 
437 function ‪tesla_play_arc_fx( target, waitTime )
438 {
439  if ( !IsDefined( self ) || !IsDefined( target ) )
440  {
441  return;
442  }
443 
444  tag = "J_SpineUpper";
445  target_tag = "J_SpineUpper";
446 
447  origin = self GetTagOrigin( tag );
448  target_origin = target GetTagOrigin( target_tag );
449 
450  distance_squared = 128 * 128;
451 
452  if ( DistanceSquared( origin, target_origin ) < distance_squared )
453  {
454  //( "TESLA: Not playing arcing FX. Enemies too close." );
455  return;
456  }
457 
458  fxOrg = ‪spawn( "script_model", origin );
459  fxOrg SetModel( "tag_origin" );
460 
461  fx = PlayFxOnTag( level._effect["prox_grenade_chain_bolt"], fxOrg, "tag_origin" );
462  playsoundatposition( "wpn_tesla_bounce", fxOrg.origin );
463 
464  fxOrg MoveTo( target_origin, waitTime );
465  fxOrg waittill( "movedone" );
466  fxOrg delete();
467 }
468 
469 /#
471 {
472  ‪util::debug_sphere( self.origin + (0,0,50), 20, (1,1,1), 1, 0 );
473 }
474 #/
475 
476 function ‪watchProximityGrenadeHitPlayer( owner ) // self = grenade
477 {
478  self endon( "death" );
479 
480  self SetOwner( owner );
481  self SetTeam( owner.team );
482 
483  while( 1 )
484  {
485  self waittill("grenade_bounce", pos, normal, ent, surface);
486 
487  if ( isdefined(ent) && isplayer( ent ) && surface != "riotshield" )
488  {
489  if ( ( level.teambased && ent.team == self.owner.team ))
490  {
491  continue;
492  }
493 
494  self ‪proximityDetonate(self.owner, self.weapon );
495  return;
496  }
497  }
498 }
499 
500 function ‪performHudEffects( position, distanceToGrenade )
501 {
502  forwardVec = VectorNormalize( AnglesToForward( self.angles ) );
503  rightVec = VectorNormalize( AnglesToRight( self.angles ) );
504  explosionVec = VectorNormalize( position - self.origin );
505 
506  fDot = VectorDot( explosionVec, forwardVec );
507  rDot = VectorDot( explosionVec, rightVec );
508 
509  fAngle = ACos( fDot );
510  rAngle = ACos( rDot );
511 }
512 
513 function ‪damagePlayerInRadius( position, eAttacker, killCamEnt ) // self = player in radius
514 {
515  self notify( "proximityGrenadeDamageStart" );
516  self endon( "proximityGrenadeDamageStart" );
517  self endon( "disconnect" );
518  self endon( "death" );
519  eAttacker endon( "disconnect" );
520 
521  PlayFxOnTag( level._effect["prox_grenade_player_shock"], self, "J_SpineUpper" );
522  g_time = GetTime();
523 
524  if ( self ‪util::mayApplyScreenEffect() )
525  {
526  if ( !self hasPerk ("specialty_proximityprotection") )
527  {
528  self.lastShockedBy = eAttacker;
529  self.shockEndTime = getTime() + ( level.proximityGrenadeDuration * 1000 );
530  self shellshock("proximity_grenade", level.proximityGrenadeDuration, false );
531  }
532 
534  }
535 
536  self playrumbleonentity("proximity_grenade");
537  self PlaySound( "wpn_taser_mine_zap" );
538 
539  if ( !self hasPerk ("specialty_proximityprotection") )
540  {
541  self thread ‪watch_death();
542 
543  if ( !isdefined( killCamEnt ) )
544  {
545  killCamEnt = ‪spawn( "script_model", position + (0,0,8) );
546  }
547 
548  killCamEnt.soundMod = "taser_spike";
549  killCamEnt ‪util::deleteAfterTime( 3 + level.proximityGrenadeDOTDamageTime * level.proximityGrenadeDOTDamageInstances);
550  self ‪util::show_hud( 0 );
551 
552  ‪damage = level.proximityGrenadeDOTDamageAmount;
553 
554  if( level.hardcoreMode )
555  {
556  ‪damage = level.proximityGrenadeDOTDamageAmountHardcore;
557  }
558 
559  for ( i = 0; i < level.proximityGrenadeDOTDamageInstances; i++ )
560  {
561  assert( isdefined( eAttacker ) );
562 
563  if ( !isdefined( killCamEnt ) )
564  {
565  killCamEnt = ‪spawn( "script_model", position + (0,0,8) );
566  killCamEnt.soundMod = "taser_spike";
567  killCamEnt ‪util::deleteAfterTime( 3 + level.proximityGrenadeDOTDamageTime * ( level.proximityGrenadeDOTDamageInstances - i ) );
568  }
569 
570  self DoDamage( ‪damage, position, eAttacker, killCamEnt, "none", "MOD_GAS", 0, GetWeapon( "proximity_grenade_aoe" ) );
571 
572  wait( level.proximityGrenadeDOTDamageTime );
573  }
574 
575  if (GetTime() - g_time < (level.proximityGrenadeDuration*1000) )
576  {
577  wait ( ( GetTime() - g_time) / 1000);
578  }
579 
580  //self shellshock("proximity_grenade_exit", 0.6, false );
581  self ‪util::show_hud( 1 );
582  }
583  else
584  {
585  wait( level.proximityGrenadeProtectedTime );
586  }
587 
589 }
590 
591 function ‪proximityDeathWait( owner )
592 {
593  self waittill( "death" );
594 
595  self notify( "deleteSound" );
596 }
597 
598 function ‪deleteEntOnOwnerDeath( owner )
599 {
600  self thread ‪deleteEntOnTimeout();
601  self thread ‪deleteEntAfterTime();
602  self endon( "delete" );
603  owner waittill( "death" );
604  self notify( "deleteSound" );
605 }
606 
608 {
609  self endon( "delete" );
610  wait( 10.0 );
611  self notify( "deleteSound" );
612 }
613 
615 {
616  self endon( "delete" );
617  self waittill( "deleteSound" );
618  self delete();
619 }
620 
621 function ‪watch_death() // self == player
622 {
623  self endon( "disconnect" );
624  self notify( "proximity_cleanup" );
625  self endon( "proximity_cleanup" );
626 
627  // fail safe stuff for if the player dies
628  self waittill("death");
629  self StopRumble( "proximity_grenade" );
630  self setblur(0,0);
631  self ‪util::show_hud( 1 );
633  //self setEMPJammed( false );
634 }
635 
637 {
638  self thread ‪createProximityGrenadeWatcher();
640  self thread ‪begin_other_grenade_tracking();
641 }
642 
644 {
645  self endon( "death" );
646  self endon( "disconnect" );
647 
648  self notify( "proximityTrackingStart" );
649  self endon( "proximityTrackingStart" );
650 
651  for (;;)
652  {
653  self waittill ( "grenade_fire", grenade, weapon, cookTime );
654 
655  if ( grenade ‪util::isHacked() )
656  {
657  continue;
658  }
659 
660  if ( weapon.rootWeapon.name == "proximity_grenade" )
661  {
662  grenade thread ‪watchProximityGrenadeHitPlayer( self );
663  }
664  }
665 }
666 
667 function ‪on_damage( eAttacker, eInflictor, weapon, meansOfDeath, ‪damage )
668 {
669  self thread ‪proximityGrenadeDamagePlayer( eAttacker, eInflictor, eInflictor.killCamEnt, weapon, meansOfDeath, ‪damage, undefined );
670 }
‪proximityGrenadeChain
‪function proximityGrenadeChain(eAttacker, eInflictor, killCamEnt, weapon, meansOfDeath, damage, proximityChain, delay)
Definition: _proximity_grenade.gsc:297
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪weaponStun
‪function weaponStun()
Definition: _weaponobjects.gsc:1128
‪debugChainSphere
‪function debugChainSphere()
Definition: _proximity_grenade.gsc:470
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪debug_sphere
‪function debug_sphere(origin, radius, color, alpha, time)
Definition: _airsupport.gsc:1153
‪destroyedExplosive
‪function destroyedExplosive(weapon)
Definition: challenges_shared.gsc:951
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪onSpawnProximityGrenadeWeaponObject
‪function onSpawnProximityGrenadeWeaponObject(watcher, owner)
Definition: _proximity_grenade.gsc:135
‪deleteAfterTime
‪function deleteAfterTime(time)
Definition: util_shared.gsc:2710
‪show_hud
‪function show_hud(b_show)
Definition: util_shared.gsc:4025
‪trackOnOwner
‪function trackOnOwner(owner)
Definition: _proximity_grenade.gsc:150
‪deleteEntOnOwnerDeath
‪function deleteEntOnOwnerDeath(owner)
Definition: _proximity_grenade.gsc:598
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪if
‪if(on_off)
Definition: util_shared.csc:908
‪register
‪function register()
Definition: _proximity_grenade.gsc:62
‪damagePlayerInRadius
‪function damagePlayerInRadius(position, eAttacker, killCamEnt)
Definition: _proximity_grenade.gsc:513
‪addPlayerToChain
‪function addPlayerToChain(player)
Definition: _proximity_grenade.gsc:290
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪PROXY_PLAYER_NOT_TAZERED
‪#define PROXY_PLAYER_NOT_TAZERED
Definition: shared.gsh:331
‪proximityDeathWait
‪function proximityDeathWait(owner)
Definition: _proximity_grenade.gsc:591
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪begin_other_grenade_tracking
‪function begin_other_grenade_tracking()
Definition: _proximity_grenade.gsc:643
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪deleteEntAfterTime
‪function deleteEntAfterTime()
Definition: _proximity_grenade.gsc:607
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪watch_death
‪function watch_death()
Definition: _proximity_grenade.gsc:621
‪isInChain
‪function isInChain(player)
Definition: _proximity_grenade.gsc:283
‪proximityDetonate
‪function proximityDetonate(attacker, weapon, target)
Definition: _proximity_grenade.gsc:187
‪getProximityChain
‪function getProximityChain()
Definition: _proximity_grenade.gsc:217
‪on_damage
‪function on_damage(eAttacker, eInflictor, weapon, meansOfDeath, damage)
Definition: _proximity_grenade.gsc:667
‪add_weapon_damage
‪function add_weapon_damage(weapontype, callback)
Definition: callbacks_shared.gsc:580
‪cleanupKillCamEntOnDeath
‪function cleanupKillCamEntOnDeath()
Definition: _proximity_grenade.gsc:180
‪cleanUpProximityChainEnt
‪function cleanUpProximityChainEnt()
Definition: _proximity_grenade.gsc:250
‪tesla_play_arc_fx
‪function tesla_play_arc_fx(target, waitTime)
Definition: _proximity_grenade.gsc:437
‪createProximityWeaponObjectWatcher
‪function createProximityWeaponObjectWatcher(weaponname, ownerTeam)
Definition: _weaponobjects.gsc:1307
‪waitTillNotMoving
‪function waitTillNotMoving()
Definition: util_shared.gsc:2621
‪watchProximityGrenadeHitPlayer
‪function watchProximityGrenadeHitPlayer(owner)
Definition: _proximity_grenade.gsc:476
‪proximityGrenadeDamagePlayer
‪function proximityGrenadeDamagePlayer(eAttacker, eInflictor, killCamEnt, weapon, meansOfDeath, damage, proximityChain)
Definition: _proximity_grenade.gsc:204
‪onSpawnProximityWeaponObject
‪function onSpawnProximityWeaponObject(watcher, owner)
Definition: _weaponobjects.gsc:1603
‪chainPlayer
‪function chainPlayer(eAttacker, killCamEnt, weapon, meansOfDeath, damage, proximityChain, player, distanceSq)
Definition: _proximity_grenade.gsc:407
‪setupKillCamEnt
‪function setupKillCamEnt()
Definition: _proximity_grenade.gsc:170
‪updateDvars
‪function updateDvars()
Definition: _proximity_grenade.gsc:67
‪debug_line
‪function debug_line(from, to, color, time, depthTest)
Definition: _airsupport.gsc:1089
‪chainIsActive
‪function chainIsActive(chain)
Definition: _proximity_grenade.gsc:239
‪weaponDetonate
‪function weaponDetonate(attacker, weapon)
Definition: _weaponobjects.gsc:563
‪init_shared
‪function init_shared()
Definition: _proximity_grenade.gsc:23
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪mayApplyScreenEffect
‪function mayApplyScreenEffect()
Definition: util_shared.gsc:2613
‪friendlyFireCheck
‪function friendlyFireCheck(owner, attacker, forcedFriendlyFireRule)
Definition: _weaponobjects.gsc:2733
‪deleteEntOnTimeout
‪function deleteEntOnTimeout()
Definition: _proximity_grenade.gsc:614
‪performHudEffects
‪function performHudEffects(position, distanceToGrenade)
Definition: _proximity_grenade.gsc:500
‪createProximityGrenadeWatcher
‪function createProximityGrenadeWatcher()
Definition: _proximity_grenade.gsc:88
‪PROXY_PLAYER_TAZERED
‪#define PROXY_PLAYER_TAZERED
Definition: shared.gsh:332
‪on_player_spawned
‪function on_player_spawned()
Definition: _proximity_grenade.gsc:636
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪createGadgetProximityGrenadeWatcher
‪function createGadgetProximityGrenadeWatcher()
Definition: _proximity_grenade.gsc:112