‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_weapons.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\bb_shared;
5 #using scripts\shared\challenges_shared;
6 #using scripts\shared\gameobjects_shared;
7 #using scripts\shared\util_shared;
8 #using scripts\shared\weapons_shared;
9 
10 #insert scripts\shared\shared.gsh;
11 
12 #using scripts\zm\gametypes\_globallogic_utils;
13 #using scripts\zm\gametypes\_shellshock;
14 #using scripts\zm\gametypes\_weapon_utils;
15 #using scripts\zm\gametypes\_weaponobjects;
16 
17 #using scripts\zm\_bb;
18 #using scripts\zm\_challenges;
19 #using scripts\zm\_util;
20 #using scripts\zm\_zm_pers_upgrades_functions;
21 
22 #namespace weapons;
23 
24 #precache( "material", "hud_scavenger_pickup" );
25 
26 function ‪init()
27 {
28  level.missileEntities = [];
29  level.hackerToolTargets = [];
30 
31  if ( !isdefined(level.grenadeLauncherDudTime) )
32  level.grenadeLauncherDudTime = 0;
33 
34  if ( !isdefined(level.thrownGrenadeDudTime) )
35  level.thrownGrenadeDudTime = 0;
36 
37  level thread ‪onPlayerConnect();
38 }
39 
41 {
42  for(;;)
43  {
44  level waittill("connecting", player);
45 
46  player.usedWeapons = false;
47  player.lastFireTime = 0;
48  player.hits = 0;
49  player ‪scavenger_hud_create();
50 
51  player thread ‪onPlayerSpawned();
52  }
53 }
54 
56 {
57  self endon("disconnect");
58 
59  for(;;)
60  {
61  self waittill("spawned_player");
62 
63  self.concussionEndTime = 0;
64  self.hasDoneCombat = false;
65  self.shieldDamageBlocked = 0;
66  self thread ‪watchWeaponUsage();
67  self thread ‪watchGrenadeUsage();
68  self thread ‪watchMissileUsage();
69  self thread ‪watchWeaponChange();
70  self thread ‪watchRiotShieldUse();
71 
72  self thread ‪trackWeapon();
73 
74  self.droppedDeathWeapon = undefined;
75  self.tookWeaponFrom = [];
76  self.pickedUpWeaponKills = [];
77 
78  self thread ‪updateStowedWeapon();
79  }
80 }
81 
83 {
84  self endon("death");
85  self endon("disconnect");
86 
87  self.lastDroppableWeapon = self GetCurrentWeapon();
88 
89  while(1)
90  {
91  previous_weapon = self GetCurrentWeapon();
92  self waittill( "weapon_change", newWeapon );
93 
94  if ( ‪mayDropWeapon( newWeapon ) )
95  {
96  self.lastDroppableWeapon = newWeapon;
97  }
98  }
99 }
100 
101 //******************************************************************
102 // *
103 // *
104 //******************************************************************
105 function ‪watchRiotShieldUse() // self == player
106 {
107  /*self endon( "death" );
108  self endon( "disconnect" );
109 
110  // watcher for attaching the model to correct player bones
111  self thread _riotshield::trackRiotShield();
112 
113  for ( ;; )
114  {
115  self waittill( "raise_riotshield" );
116  self thread _riotshield::startRiotshieldDeploy();
117  }*/
118 }
119 
121 {
122  if ( isdefined( self.currentWeapon ) && isdefined( self.currentWeaponStartTime ) )
123  {
124  totalTime = int ( ( newTime - self.currentWeaponStartTime ) / 1000 );
125  if ( totalTime > 0 )
126  {
127  self AddWeaponStat( self.currentWeapon, "timeUsed", totalTime );
128  self.currentWeaponStartTime = newTime;
129  }
130  }
131 }
132 
133 function ‪updateWeaponTimings( newTime )
134 {
135  if ( self ‪util::is_bot() )
136  {
137  return;
138  }
139 
141 
142  if ( !isdefined( self.staticWeaponsStartTime ) )
143  {
144  return;
145  }
146 
147  totalTime = int ( ( newTime - self.staticWeaponsStartTime ) / 1000 );
148 
149  if ( totalTime < 0 )
150  {
151  return;
152  }
153 
154  self.staticWeaponsStartTime = newTime;
155 
156 
157  // Record grenades and equipment
158  if( isdefined( self.weapon_array_grenade ) )
159  {
160  for( i=0; i<self.weapon_array_grenade.size; i++ )
161  {
162  self AddWeaponStat( self.weapon_array_grenade[i], "timeUsed", totalTime );
163  }
164  }
165  if( isdefined( self.weapon_array_inventory ) )
166  {
167  for( i=0; i<self.weapon_array_inventory.size; i++ )
168  {
169  self AddWeaponStat( self.weapon_array_inventory[i], "timeUsed", totalTime );
170  }
171  }
172 
173  // Record killstreaks
174  if( isdefined( self.killstreak ) )
175  {
176  for( i=0; i<self.killstreak.size; i++ )
177  {
178  killstreakWeapon = level.menuReferenceForKillStreak[ self.killstreak[i] ];
179  if ( isdefined( killstreakWeapon ) )
180  {
181  self AddWeaponStat( killstreakWeapon, "timeUsed", totalTime );
182  }
183  }
184  }
185 
186  // Record all of the equipped perks
187  if ( level.rankedmatch && level.perksEnabled )
188  {
189  perksIndexArray = [];
190 
191  specialtys = self.specialty;
192 
193  if ( !isdefined( specialtys ) )
194  {
195  return;
196  }
197 
198  if ( !isdefined( self.curClass ) )
199  {
200  return;
201  }
202 
203  if ( isdefined( self.class_num ) )
204  {
205  for ( numSpecialties = 0; numSpecialties < level.maxSpecialties; numSpecialties++ )
206  {
207  perk = self GetLoadoutItem( self.class_num, "specialty" + ( numSpecialties + 1 ) );
208  if ( perk != 0 )
209  {
210  perksIndexArray[ perk ] = true;
211  }
212  }
213 
214  perkIndexArrayKeys = getarraykeys( perksIndexArray );
215  for ( i = 0; i < perkIndexArrayKeys.size; i ++ )
216  {
217  if ( perksIndexArray[ perkIndexArrayKeys[i] ] == true )
218  {
219  self AddDStat( "itemStats", perkIndexArrayKeys[i], "stats", "timeUsed", "statValue", totalTime );
220  }
221  }
222  }
223  }
224 }
225 
226 function ‪trackWeapon()
227 {
228  currentWeapon = self getCurrentWeapon();
229  currentTime = getTime();
230  spawnid = getplayerspawnid( self );
231 
232  while(1)
233  {
234  event = self ‪util::waittill_any_return( "weapon_change", "death", "disconnect" );
235  newTime = getTime();
236 
237  if( event == "weapon_change" )
238  {
239  newWeapon = self getCurrentWeapon();
240  if( newWeapon != level.weaponNone && newWeapon != currentWeapon )
241  {
243  //self _class::initWeaponAttachments( newWeapon );
244 
245  currentWeapon = newWeapon;
246  currentTime = newTime;
247  }
248  }
249  else
250  {
251  if( event != "disconnect" )
252  {
253  ‪updateWeaponTimings( newTime );
254  }
255 
256  return;
257  }
258  }
259 }
260 
261 function ‪mayDropWeapon( weapon )
262 {
263  if ( level.disableWeaponDrop == 1 )
264  return false;
265 
266  if ( weapon == level.weaponNone )
267  return false;
268 
269  if ( !weapon.isPrimary )
270  return false;
271 
272  return true;
273 }
274 
275 function ‪dropWeaponForDeath( attacker )
276 {
277  if ( level.disableWeaponDrop == 1 )
278  return;
279 
280  weapon = self.lastDroppableWeapon;
281 
282  if ( isdefined( self.droppedDeathWeapon ) )
283  return;
284 
285  if ( !isdefined( weapon ) )
286  {
287  return;
288  }
289 
290  if ( weapon == level.weaponNone )
291  {
292  return;
293  }
294 
295  if ( !self hasWeapon( weapon ) )
296  {
297  return;
298  }
299 
300  if ( !(self AnyAmmoForWeaponModes( weapon )) )
301  {
302  return;
303  }
304 
305  if ( !‪shouldDropLimitedWeapon( weapon, self ) )
306  {
307  return;
308  }
309 
310  clipAmmo = self GetWeaponAmmoClip( weapon );
311  stockAmmo = self GetWeaponAmmoStock( weapon );
312  clip_and_stock_ammo = clipAmmo + stockAmmo;
313 
314  //Check if the weapon has ammo
315  if( !clip_and_stock_ammo )
316  {
317  return;
318  }
319 
320  stockMax = weapon.maxAmmo;
321  if ( stockAmmo > stockMax )
322  stockAmmo = stockMax;
323 
324  item = self dropItem( weapon );
325 
326  if ( !isdefined( item ) )
327  {
328 
329  return;
330  }
331 
332  ‪dropLimitedWeapon( weapon, self, item );
333 
334  self.droppedDeathWeapon = true;
335 
336  item ItemWeaponSetAmmo( clipAmmo, stockAmmo );
337 
338  item.owner = self;
339  item.ownersattacker = attacker;
340 
341  item thread ‪watchPickup();
342 
343  item thread ‪deletePickupAfterAWhile();
344 }
345 
347 {
348  self endon("death");
349 
350  wait 60;
351 
352  if ( !isdefined( self ) )
353  return;
354 
355  self delete();
356 }
357 
358 function ‪watchPickup()
359 {
360  self endon("death");
361 
362  weapon = self.item;
363 
364  while(1)
365  {
366  self waittill( "trigger", player, droppedItem );
367 
368  if ( isdefined( droppedItem ) )
369  break;
370  // otherwise, player merely acquired ammo and didn't pick this up
371  }
372 
373  assert( isdefined( player.tookWeaponFrom ) );
374  assert( isdefined( player.pickedUpWeaponKills ) );
375 
376  if ( isdefined( droppedItem ) )
377  {
378  for ( i = 0; i < droppedItem.size; i++ )
379  {
380  if ( !IsDefined( droppedItem[i] ) )
381  {
382  continue;
383  }
384 
385  // make sure the owner information on the dropped item is preserved
386  droppedWeapon = droppedItem[i].item;
387  if ( isdefined( player.tookWeaponFrom[ droppedWeapon ] ) )
388  {
389  droppedItem[i].owner = player.tookWeaponFrom[ droppedWeapon ];
390  droppedItem[i].ownersattacker = player;
391  player.tookWeaponFrom[ droppedWeapon ] = undefined;
392  }
393  droppedItem[i] thread ‪watchPickup();
394  }
395  }
396 
397  // take owner information from self and put it onto player
398  if ( isdefined( self.ownersattacker ) && self.ownersattacker == player )
399  {
400  player.tookWeaponFrom[ weapon ] = self.owner;
401  player.pickedUpWeaponKills[ weapon ] = 0;
402  }
403  else
404  {
405  player.tookWeaponFrom[ weapon ] = undefined;
406  player.pickedUpWeaponKills[ weapon ] = undefined;
407  }
408 }
409 
411 {
412  self endon( "death" );
413  self endon( "disconnect" );
414  level endon ( "game_ended" );
415 
416  // need to know if we used a killstreak weapon
417  self.usedKillstreakWeapon = [];
418  self.usedKillstreakWeapon["minigun"] = false;
419  self.usedKillstreakWeapon["m32"] = false;
420  self.usedKillstreakWeapon["m202_flash"] = false;
421  self.usedKillstreakWeapon["m220_tow"] = false;
422  self.usedKillstreakWeapon["mp40_blinged"] = false;
423  self.killstreakType = [];
424  self.killstreakType["minigun"] = "minigun";
425  self.killstreakType["m32"] = "m32";
426  self.killstreakType["m202_flash"] = "m202_flash";
427  self.killstreakType["m220_tow"] = "m220_tow";
428  self.killstreakType["mp40_blinged"] = "mp40_blinged_drop";
429 
430  for ( ;; )
431  {
432  self waittill ( "weapon_fired", curWeapon );
433  self.lastFireTime = GetTime();
434 
435  self.hasDoneCombat = true;
436 
437  switch ( curWeapon.weapClass )
438  {
439  case "rifle":
440  case "pistol":
441  case "mg":
442  case "smg":
443  case "spread":
444  self ‪trackWeaponFire( curWeapon );
445  level.globalShotsFired++;
446  break;
447  case "rocketlauncher":
448  case "grenade":
449  self AddWeaponStat( curWeapon, "shots", 1 );
450  break;
451  default:
452  break;
453  }
454 
455  /*if( _killstreak_weapons::isHeldKillstreakWeapon( curWeapon ) )
456  {
457  self.pers["held_killstreak_ammo_count"][curWeapon]--;
458  self.usedKillstreakWeapon[ curWeapon.name ] = true;
459 
460  }*/
461  }
462 }
463 
464 
465 function ‪trackWeaponFire( curWeapon )
466 {
467  shotsFired = 1;
468 
469  if ( isdefined( self.lastStandParams ) && self.lastStandParams.lastStandStartTime == getTime() )
470  {
471  self.hits = 0;
472  return;
473  }
474 
475  pixbeginevent("trackWeaponFire");
476 
477  misses = int( max( 0, shotsFired - self.hits ) );
478 
479  self AddWeaponStat( curWeapon, "shots", shotsFired );
480  self AddWeaponStat( curWeapon, "hits", self.hits );
481  self AddWeaponStat( curWeapon, "misses", misses );
482 
483 
484  // recording zombie bullets
485  if ( isdefined( level.add_client_stat ) )
486  {
487  self [[level.add_client_stat]]( "total_shots", shotsFired );
488  self [[level.add_client_stat]]( "hits", self.hits );
489  self [[level.add_client_stat]]( "misses", misses );
490  }
491  else
492  {
493  self AddPlayerStat( "total_shots", shotsFired );
494  self AddPlayerStat( "hits", self.hits );
495  self AddPlayerStat( "misses", misses );
496  }
497 
498  self IncrementPlayerStat( "total_shots", shotsFired );
499  self IncrementPlayerStat( "hits", self.hits );
500  self IncrementPlayerStat( "misses", misses );
501 
502  //println("hit:" + self.hits + "total_shots:" + shotsFired);
503 
504  self.hits = 0;
505  pixendevent();
506 }
507 
509 {
510  self endon( "death" );
511  self endon( "disconnect" );
512 
513  self.throwingGrenade = false;
514  self.gotPullbackNotify = false;
515 
516  self thread ‪beginOtherGrenadeTracking();
517 
518  self thread ‪watchForThrowbacks();
519  self thread ‪watchForGrenadeDuds();
520  self thread ‪watchForGrenadeLauncherDuds();
521 
522  for ( ;; )
523  {
524  self waittill ( "grenade_pullback", weapon );
525 
526  self AddWeaponStat( weapon, "shots", 1 );
527 
528  self.hasDoneCombat = true;
529 
530  self.throwingGrenade = true;
531  self.gotPullbackNotify = true;
532 
533  if ( weapon.drawOffhandModelInHand )
534  {
535  self SetOffhandVisible( true );
536  self thread ‪watch_offhand_end();
537  }
538 
539  self thread ‪beginGrenadeTracking();
540  }
541 }
542 
544 {
545  self endon( "death" );
546  self endon( "disconnect" );
547  level endon ( "game_ended" );
548 
549  for ( ;; )
550  {
551  self waittill ( "missile_fire", missile, weapon );
552 
553  self.hasDoneCombat = true;
554 
555 
556  level.missileEntities[ level.missileEntities.size ] = missile;
557  missile.weapon = weapon;
558  missile thread ‪watchMissileDeath();
559  }
560 }
561 
562 function ‪watchMissileDeath() // self == missile
563 {
564  self waittill( "death" );
565  ArrayRemoveValue( level.missileEntities, self );
566 }
567 
568 function ‪dropWeaponsToGround( origin, radius )
569 {
570  weapons = GetDroppedWeapons();
571  for ( i = 0 ; i < weapons.size ; i++ )
572  {
573  if ( DistanceSquared( origin, weapons[i].origin ) < radius * radius )
574  {
575  ‪trace = bullettrace( weapons[i].origin, weapons[i].origin + (0,0,-2000), false, weapons[i] );
576  weapons[i].origin = ‪trace["position"];
577  }
578  }
579 }
580 
581 function ‪dropGrenadesToGround( origin, radius )
582 {
583  grenades = getentarray( "grenade", "classname" );
584  for( i = 0 ; i < grenades.size ; i++ )
585  {
586  if( DistanceSquared( origin, grenades[i].origin )< radius * radius )
587  {
588  grenades[i] ‪launch( (5,5,5) );
589  }
590  }
591 }
592 
594 {
595  self endon ( "death" );
596  self endon ( "disconnect" );
597  self endon ( "grenade_fire" );
598 
599  waittillframeend;
600  weapon = level.weaponNone;
601 
602  while( self IsThrowingGrenade() && weapon == level.weaponNone )
603  {
604  self waittill( "weapon_change", weapon );
605  }
606 
607  self.throwingGrenade = false;
608  self.gotPullbackNotify = false;
609 }
610 
611 
612 function ‪watch_offhand_end() // self == player
613 {
614  self notify( "watchOffhandEnd" );
615  self endon( "watchOffhandEnd" );
616 
617  while ( self ‪is_using_offhand_equipment() )
618  {
619  msg = self ‪util::waittill_any_return( "death", "disconnect", "grenade_fire", "weapon_change", "watchOffhandEnd" );
620 
621  if (( msg == "death" ) || ( msg == "disconnect" ))
622  {
623  break;
624  }
625  }
626 
627  self SetOffhandVisible( false );
628 }
629 
630 function ‪is_using_offhand_equipment() // self == player
631 {
632  if ( self IsUsingOffhand() )
633  {
634  weapon = self GetCurrentOffhand();
635  if ( weapon.isEquipment )
636  {
637  return true;
638  }
639  }
640 
641  return false;
642 }
643 
644 
646 {
647  self endon ( "death" );
648  self endon ( "disconnect" );
649 
650  ‪startTime = getTime();
651 
652  self thread ‪watchGrenadeCancel();
653 
654  self waittill ( "grenade_fire", grenade, weapon );
655 
656  // catch cases where antoher thread (presumably also waiting on "grenade_fire") has seen fit to delete the grenade before we got a chance to handle it
657  if (!isdefined(grenade))
658  return;
659 
660  level.missileEntities[ level.missileEntities.size ] = grenade;
661  grenade.weapon = weapon;
662  grenade thread ‪watchMissileDeath();
663 
664  if ( grenade ‪util::isHacked() )
665  {
666  return;
667  }
668 
669  // Removed a blackbox print for "mpequipmentuses" from here
670 
671  if ( (getTime() - ‪startTime > 1000) )
672  grenade.isCooked = true;
673 
674  switch( weapon.name )
675  {
676  case "frag_grenade":
677  case "sticky_grenade":
678  self AddWeaponStat( weapon, "used", 1 );
679  // fall through on purpose
680  case "explosive_bolt":
681  grenade.originalOwner = self;
682  break;
683  }
684  self.throwingGrenade = false;
685 }
686 
688 {
689 /* self notify( "grenadeTrackingStart" );
690 
691  self endon( "grenadeTrackingStart" );
692  self endon( "disconnect" );
693  for (;;)
694  {
695  self waittill ( "grenade_fire", grenade, weapon );
696 
697  if ( grenade util::isHacked() )
698  {
699  continue;
700  }
701 
702  switch( weapon.name )
703  {
704  case "flash_grenade":
705  break;
706  case "concussion_grenade":
707  break;
708  // case "willy_pete":
709  grenade thread _smokegrenade::watchSmokeGrenadeDetonation( self );
710  break;
711  case "tabun_gas":
712  grenade thread _tabun::watchTabunGrenadeDetonation( self );
713  break;
714  case "sticky_grenade":
715  grenade thread checkStuckToPlayer( true, true, weapon );
716  break;
717  case "satchel_charge":
718  case "c4":
719  grenade thread checkStuckToPlayer( true, false, weapon );
720  break;
721  // case "proximity_grenade":
722  // grenade thread _proximity_grenade::watchProximityGrenadeHitPlayer( self );
723  // break;
724  // case "tactical_insertion":
725  // grenade thread _tacticalinsertion::watch( self );
726  // break;
727  // case "scrambler":
728  // break;
729  // case "explosive_bolt":
730  // grenade thread _explosive_bolt::watch_bolt_detonation( self );
731  // grenade thread checkStuckToPlayer( true, false, weapon );
732  // break;
733  // case "hatchet":
734  // grenade.lastWeaponBeforeToss = self util::getLastWeapon();
735  // grenade thread checkHatchetBounce();
736  // grenade thread checkStuckToPlayer( false, false, weapon );
737  // self AddWeaponStat( weapon, "used", 1 );
738  // break;
739  }
740  }*/
741 }
742 
743 function ‪checkStuckToPlayer( deleteOnTeamChange, awardScoreEvent, weapon )
744 {
745  self endon( "death" );
746 
747  self waittill( "stuck_to_player", player );
748  if ( isdefined ( player ) )
749  {
750  if ( deleteOnTeamChange )
751  self thread ‪stuckToPlayerTeamChange( player );
752 
753  if ( awardScoreEvent && isdefined ( self.originalOwner ) )
754  {
755  if ( self.originalOwner ‪util::IsEnemyPlayer( player ) )
756  {
757  }
758  }
759 
760  self.stuckToPlayer = player;
761  }
762 }
763 
765 {
766  self endon( "stuck_to_player" );
767  self endon( "death");
768  self waittill( "grenade_bounce" );
769  self.bounced = true;
770 }
771 
772 function ‪stuckToPlayerTeamChange( player )
773 {
774  self endon("death");
775  player endon("disconnect");
776  originalTeam = player.pers["team"];
777 
778  while(1)
779  {
780  player waittill("joined_team");
781 
782  if ( player.pers["team"] != originalTeam )
783  {
784  self ‪detonate();
785  return;
786  }
787  }
788 }
789 
791 {
792  self endon ( "death" );
793  self endon ( "disconnect" );
794 
795  for ( ;; )
796  {
797  self waittill ( "grenade_fire", grenade, weapon );
798  if ( self.gotPullbackNotify )
799  {
800  self.gotPullbackNotify = false;
801  continue;
802  }
803  if ( !isSubStr( weapon.name, "frag_" ) )
804  continue;
805 
806  // no grenade_pullback notify! we must have picked it up off the ground.
807  grenade.threwBack = true;
808 
809  grenade.originalOwner = self;
810  }
811 }
812 
813 function ‪registerGrenadeLauncherDudDvar( dvarString, defaultValue, minValue, maxValue )
814 {
815  dvarString = ("scr_" + dvarString + "_grenadeLauncherDudTime");
816  if ( GetDvarString( dvarString ) == "" )
817  SetDvar( dvarString, defaultValue );
818 
819  if ( getDvarInt( dvarString ) > maxValue )
820  SetDvar( dvarString, maxValue );
821  else if ( getDvarInt( dvarString ) < minValue )
822  SetDvar( dvarString, minValue );
823 
824  level.grenadeLauncherDudTimeDvar = dvarString;
825  level.grenadeLauncherDudTimeMin = minValue;
826  level.grenadeLauncherDudTimeMax = maxValue;
827  level.grenadeLauncherDudTime = getDvarInt( level.grenadeLauncherDudTimeDvar );
828 }
829 
830 function ‪registerThrownGrenadeDudDvar( dvarString, defaultValue, minValue, maxValue )
831 {
832  dvarString = ("scr_" + dvarString + "_thrownGrenadeDudTime");
833  if ( GetDvarString( dvarString ) == "" )
834  SetDvar( dvarString, defaultValue );
835 
836  if ( getDvarInt( dvarString ) > maxValue )
837  SetDvar( dvarString, maxValue );
838  else if ( getDvarInt( dvarString ) < minValue )
839  SetDvar( dvarString, minValue );
840 
841  level.thrownGrenadeDudTimeDvar = dvarString;
842  level.thrownGrenadeDudTimeMin = minValue;
843  level.thrownGrenadeDudTimeMax = maxValue;
844  level.thrownGrenadeDudTime = getDvarInt( level.thrownGrenadeDudTimeDvar );
845 }
846 
847 function ‪registerKillstreakDelay( dvarString, defaultValue, minValue, maxValue )
848 {
849  dvarString = ("scr_" + dvarString + "_killstreakDelayTime");
850  if ( GetDvarString( dvarString ) == "" )
851  SetDvar( dvarString, defaultValue );
852 
853  if ( getDvarInt( dvarString ) > maxValue )
854  SetDvar( dvarString, maxValue );
855  else if ( getDvarInt( dvarString ) < minValue )
856  SetDvar( dvarString, minValue );
857 
858  level.killstreakRoundDelay = getDvarInt( dvarString );
859 }
860 
861 function ‪turnGrenadeIntoADud( weapon, isThrownGrenade, player )
862 {
863  if ( level.roundStartExplosiveDelay >= (‪globallogic_utils::getTimePassed() / 1000) )
864  {
865  if ( weapon.disallowatmatchstart || WeaponHasAttachment( weapon, "gl" ) )
866  {
867  timeLeft = Int( level.roundStartExplosiveDelay - (‪globallogic_utils::getTimePassed() / 1000) );
868 
869  if ( !timeLeft )
870  timeLeft = 1;
871 
872  // these prints need to be changed to the correct location and they should include the weapon name
873  if ( isThrownGrenade )
874  player iPrintLnBold( &"MP_GRENADE_UNAVAILABLE_FOR_N", " " + timeLeft + " ", &"EXE_SECONDS" );
875  else
876  player iPrintLnBold( &"MP_LAUNCHER_UNAVAILABLE_FOR_N", " " + timeLeft + " ", &"EXE_SECONDS" );
877 
878 
879  self makeGrenadeDud();
880  }
881  }
882 }
883 
885 {
886  self endon( "spawned_player" );
887  self endon( "disconnect" );
888 
889  while(1)
890  {
891  self waittill( "grenade_fire", grenade, weapon );
892  grenade ‪turnGrenadeIntoADud( weapon, true, self );
893  }
894 }
895 
897 {
898  self endon( "spawned_player" );
899  self endon( "disconnect" );
900 
901  while(1)
902  {
903  self waittill( "grenade_launcher_fire", grenade, weapon );
904  grenade ‪turnGrenadeIntoADud( weapon, false, self );
905 
906 
907  level.missileEntities[ level.missileEntities.size ] = grenade;
908  grenade.weapon = weapon;
909  grenade thread ‪watchMissileDeath();
910  }
911 }
912 
913 
914 // these functions are used with scripted weapons (like satchels, shoeboxs, artillery)
915 // returns an array of objects representing damageable entities (including players) within a given sphere.
916 // each object has the property damageCenter, which represents its center (the location from which it can be damaged).
917 // each object also has the property entity, which contains the entity that it represents.
918 // to damage it, call damageEnt() on it.
919 function ‪getDamageableEnts(pos, radius, doLOS, startRadius)
920 {
921  ents = [];
922 
923  if (!isdefined(doLOS))
924  doLOS = false;
925 
926  if ( !isdefined( startRadius ) )
927  startRadius = 0;
928 
929  // players
930  players = level.players;
931  for (i = 0; i < players.size; i++)
932  {
933  if (!isalive(players[i]) || players[i].sessionstate != "playing")
934  continue;
935 
936  playerpos = players[i].origin + (0,0,32);
937  distsq = distancesquared(pos, playerpos);
938  if (distsq < radius*radius && (!doLOS || ‪weaponDamageTracePassed(pos, playerpos, startRadius, undefined)))
939  {
940  newent = spawnstruct();
941  newent.isPlayer = true;
942  newent.isADestructable = false;
943  newent.isADestructible = false;
944  newent.isActor = false;
945  newent.entity = players[i];
946  newent.damageCenter = playerpos;
947  ents[ents.size] = newent;
948  }
949  }
950 
951  // grenades
952  grenades = getentarray("grenade", "classname");
953  for (i = 0; i < grenades.size; i++)
954  {
955  entpos = grenades[i].origin;
956  distsq = distancesquared(pos, entpos);
957  if (distsq < radius*radius && (!doLOS || ‪weaponDamageTracePassed(pos, entpos, startRadius, grenades[i])))
958  {
959  newent = spawnstruct();
960  newent.isPlayer = false;
961  newent.isADestructable = false;
962  newent.isADestructible = false;
963  newent.isActor = false;
964  newent.entity = grenades[i];
965  newent.damageCenter = entpos;
966  ents[ents.size] = newent;
967  }
968  }
969 
970  // THIS IS NOT THE SAME AS THE destruct-A-bles BELOW
971  destructibles = getentarray("destructible", "targetname");
972  for (i = 0; i < destructibles.size; i++)
973  {
974  entpos = destructibles[i].origin;
975  distsq = distancesquared(pos, entpos);
976  if (distsq < radius*radius && (!doLOS || ‪weaponDamageTracePassed(pos, entpos, startRadius, destructibles[i])))
977  {
978  newent = spawnstruct();
979  newent.isPlayer = false;
980  newent.isADestructable = false;
981  newent.isADestructible = true;
982  newent.isActor = false;
983  newent.entity = destructibles[i];
984  newent.damageCenter = entpos;
985  ents[ents.size] = newent;
986  }
987  }
988 
989  // THIS IS NOT THE SAME AS THE destruct-I-bles ABOVE
990  destructables = getentarray("destructable", "targetname");
991  for (i = 0; i < destructables.size; i++)
992  {
993  entpos = destructables[i].origin;
994  distsq = distancesquared(pos, entpos);
995  if (distsq < radius*radius && (!doLOS || ‪weaponDamageTracePassed(pos, entpos, startRadius, destructables[i])))
996  {
997  newent = spawnstruct();
998  newent.isPlayer = false;
999  newent.isADestructable = true;
1000  newent.isADestructible = false;
1001  newent.isActor = false;
1002  newent.entity = destructables[i];
1003  newent.damageCenter = entpos;
1004  ents[ents.size] = newent;
1005  }
1006  }
1007 
1008  /*dogs = _dogs::dog_manager_get_dogs();
1009 
1010  foreach( dog in dogs )
1011  {
1012  if ( !IsAlive( dog ) )
1013  {
1014  continue;
1015  }
1016 
1017  entpos = dog.origin;
1018  distsq = distancesquared(pos, entpos);
1019  if (distsq < radius*radius && (!doLOS || weaponDamageTracePassed(pos, entpos, startRadius, dog)))
1020  {
1021  newent = spawnstruct();
1022  newent.isPlayer = false;
1023  newent.isADestructable = false;
1024  newent.isADestructible = false;
1025  newent.isActor = true;
1026  newent.entity = dog;
1027  newent.damageCenter = entpos;
1028  ents[ents.size] = newent;
1029  }
1030  }*/
1031 
1032  return ents;
1033 }
1034 
1035 // eInflictor = the entity that causes the damage (e.g. a shoebox)
1036 // eAttacker = the player that is attacking
1037 // iDamage = the amount of damage to do
1038 // sMeansOfDeath = string specifying the method of death (e.g. "MOD_PROJECTILE_SPLASH")
1039 // weapon = the weapon used
1040 // damagepos = the position damage is coming from
1041 // damagedir = the direction damage is moving in
1042 function ‪damageEnt(eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, damagepos, damagedir)
1043 {
1044  if (self.isPlayer)
1045  {
1046  self.damageOrigin = damagepos;
1047  self.entity thread [[level.callbackPlayerDamage]](
1048  eInflictor, // eInflictor The entity that causes the damage.(e.g. a turret)
1049  eAttacker, // eAttacker The entity that is attacking.
1050  iDamage, // iDamage Integer specifying the amount of damage done
1051  0, // iDFlags Integer specifying flags that are to be applied to the damage
1052  sMeansOfDeath, // sMeansOfDeath Integer specifying the method of death
1053  weapon, // weapon The weapon used to inflict the damage
1054  damagepos, // vPoint The point the damage is from?
1055  damagedir, // vDir The direction of the damage
1056  "none", // sHitLoc The location of the hit
1057  damagepos, // vDamageOrigin
1058  0, // psOffsetTime The time offset for the damage
1059  0, // boneIndex
1060  (1,0,0) // vSurfaceNormal
1061  );
1062  }
1063  else if (self.isactor)
1064  {
1065  self.damageOrigin = damagepos;
1066  self.entity thread [[level.callbackActorDamage]](
1067  eInflictor, // eInflictor The entity that causes the damage.(e.g. a turret)
1068  eAttacker, // eAttacker The entity that is attacking.
1069  iDamage, // iDamage Integer specifying the amount of damage done
1070  0, // iDFlags Integer specifying flags that are to be applied to the damage
1071  sMeansOfDeath, // sMeansOfDeath Integer specifying the method of death
1072  weapon, // weapon The weapon used to inflict the damage
1073  damagepos, // vPoint The point the damage is from?
1074  damagedir, // vDir The direction of the damage
1075  "none", // sHitLoc The location of the hit
1076  damagepos, // vDamageOrigin
1077  0, // psOffsetTime The time offset for the damage
1078  0, // boneIndex
1079  0, // surfaceType
1080  (1,0,0) // vSurfaceNormal
1081  );
1082  }
1083  else if (self.isADestructible)
1084  {
1085  self.damageOrigin = damagepos;
1086  self.entity DoDamage(
1087  iDamage, // iDamage Integer specifying the amount of damage done
1088  damagepos, // vPoint The point the damage is from?
1089  eAttacker, // eAttacker The entity that is attacking.
1090  eInflictor, // eInflictor The entity that causes the damage.(e.g. a turret)
1091  0,
1092  sMeansOfDeath, // sMeansOfDeath Integer specifying the method of death
1093  0, // iDFlags Integer specifying flags that are to be applied to the damage
1094  weapon // weapon The weapon used to inflict the damage
1095  );
1096  }
1097  else
1098  {
1099  self.entity ‪util::damage_notify_wrapper( iDamage, eAttacker, (0,0,0), (0,0,0), "mod_explosive", "", "" );
1100  }
1101 }
1102 
1103 function ‪debugline(‪a, b, color)
1104 {
1105  /#
1106  for (i = 0; i < 30*20; i++)
1107  {
1108  line(‪a,b, color);
1109  wait .05;
1110  }
1111  #/
1112 }
1113 
1114 
1115 function ‪onWeaponDamage( eAttacker, eInflictor, weapon, meansOfDeath, ‪damage )
1116 {
1117  self endon ( "death" );
1118  self endon ( "disconnect" );
1119 
1120  switch ( weapon.name )
1121  {
1122  case "concussion_grenade":
1123  // should match weapon settings in gdt
1124  radius = 512;
1125  if (self == eAttacker) // TFLAME 8/1/12 - reduce effects on attacker
1126  radius *= 0.5;
1127 
1128  scale = 1 - (distance( self.origin, eInflictor.origin ) / radius);
1129 
1130  if ( scale < 0 )
1131  scale = 0;
1132 
1133  time = 2 + (4 * scale);
1134 
1136 
1137  if ( self HasPerk ( "specialty_stunprotection" ) )
1138  {
1139  // do a little bit, not a complete negation
1140  time *= 0.1;
1141  }
1142 
1143  self thread ‪playConcussionSound( time );
1144 
1145  if ( self ‪util::mayApplyScreenEffect() )
1146  self shellShock( "concussion_grenade_mp", time, false );
1147 
1148  self.concussionEndTime = getTime() + (time * 1000);
1149  break;
1150 
1151  //case "proximity_grenade":
1152  // self proximityGrenadeHitPlayer( eAttacker, eInflictor );
1153  // break;
1154 
1155  default:
1156  // shellshock will only be done if meansofdeath is an appropriate type and if there is enough damage.
1157  if ( isdefined( level.shellshockOnPlayerDamage ) )
1158  {
1159  [[level.shellshockOnPlayerDamage]]( meansOfDeath, ‪damage, weapon );
1160  }
1161  break;
1162  }
1163 }
1164 
1165 function ‪playConcussionSound( duration )
1166 {
1167  self endon( "death" );
1168  self endon( "disconnect" );
1169 
1170  concussionSound = ‪spawn ("script_origin",(0,0,1));
1171  concussionSound.origin = self.origin;
1172  concussionSound linkTo( self );
1173  concussionSound thread ‪deleteEntOnOwnerDeath( self );
1174  concussionSound playsound( "" );
1175  concussionSound playLoopSound ( "" );
1176  if ( duration > 0.5 )
1177  wait( duration - 0.5 );
1178  concussionSound playsound( "" );
1179  concussionSound StopLoopSound( .5);
1180  wait(0.5);
1181 
1182  concussionSound notify ( "delete" );
1183  concussionSound delete();
1184 }
1185 
1186 function ‪deleteEntOnOwnerDeath( owner )
1187 {
1188  self endon( "delete" );
1189  owner waittill( "death" );
1190  self delete();
1191 }
1192 
1193 // weapon stowing logic ===================================================================
1194 
1195 // thread loop life = player's life
1197 {
1198  self endon( "spawned" );
1199  self endon( "killed_player" );
1200  self endon( "disconnect" );
1201 
1202  //detach_all_weapons();
1203 
1204  self.tag_stowed_back = undefined;
1205  self.tag_stowed_hip = undefined;
1206 
1207  team = self.pers["team"];
1208  curclass = self.pers["class"];
1209 
1210  while ( true )
1211  {
1212  self waittill( "weapon_change", newWeapon );
1213 
1214  // weapon array reset, might have swapped weapons off the ground
1215  self.weapon_array_primary =[];
1216  self.weapon_array_sidearm = [];
1217  self.weapon_array_grenade = [];
1218  self.weapon_array_inventory =[];
1219 
1220  // populate player's weapon stock arrays
1221  weaponsList = self GetWeaponsList();
1222  for( idx = 0; idx < weaponsList.size; idx++ )
1223  {
1224  // we don't want these in the primary list
1225  switch( weaponsList[idx] )
1226  {
1227  case "minigun": // death machine
1228  case "m32": // grenade launcher
1229  case "m202_flash": // grim reaper
1230  case "m220_tow": // tv guided missile
1231  case "mp40_blinged": // cod5 mp40
1232  case "zipline":
1233  continue;
1234 
1235  default:
1236  break;
1237  }
1238 
1239  if ( ‪weapons::is_primary_weapon( weaponsList[idx] ) )
1240  self.weapon_array_primary[self.weapon_array_primary.size] = weaponsList[idx];
1241  else if ( ‪weapons::is_side_arm( weaponsList[idx] ) )
1242  self.weapon_array_sidearm[self.weapon_array_sidearm.size] = weaponsList[idx];
1243  else if ( ‪weapons::is_grenade( weaponsList[idx] ) )
1244  self.weapon_array_grenade[self.weapon_array_grenade.size] = weaponsList[idx];
1245  else if ( ‪weapons::is_inventory( weaponsList[idx] ) )
1246  self.weapon_array_inventory[self.weapon_array_inventory.size] = weaponsList[idx];
1247  else if ( weaponsList[idx].isPrimary )
1248  self.weapon_array_primary[self.weapon_array_primary.size] = weaponsList[idx];
1249  }
1250 
1254  }
1255 }
1256 
1258 {
1259  assert( IsPlayer( self ) );
1260  assert( isdefined( self.curClass ) );
1261 
1262  if ( isdefined( level.classToClassNum[ self.curClass ] ) )
1263  {
1264  return level.classToClassNum[ self.curClass ];
1265  }
1266 
1267  class_num = int( self.curClass[self.curClass.size-1] )-1;
1268 
1269  //hacky patch to the system since when it was written it was never thought of that there could be 10 custom slots
1270  if( -1 == class_num )
1271  class_num = 9;
1272 
1273  return class_num;
1274 }
1275 
1277 {
1278  if ( isdefined( level.giveCustomLoadout ) )
1279  {
1280  return level.weaponNone;
1281  }
1282 
1283  class_num = self ‪loadout_get_class_num();
1284 
1285  index = 0;//self _class::getLoadoutItemFromDDLStats( class_num, stat );
1286 
1287  if ( isdefined( level.tbl_weaponIDs[index] ) && isdefined( level.tbl_weaponIDs[index]["reference"] ) )
1288  {
1289  return GetWeapon( level.tbl_weaponIDs[index]["reference"] );
1290  }
1291 
1292  return level.weaponNone;
1293 }
1294 
1296 {
1297  if ( isdefined( level.giveCustomLoadout ) )
1298  {
1299  return 0;
1300  }
1301 
1302  class_num = self ‪loadout_get_class_num();
1303  count = 0;//self _class::getLoadoutItemFromDDLStats( class_num, stat );
1304 
1305  return count;
1306 }
1307 
1309 {
1310  self endon( "death" );
1311  self waittill( "scavenger", player );
1312 
1313  primary_weapons = player GetWeaponsListPrimaries();
1314  offhand_weapons_and_alts = array::exclude( player GetWeaponsList( true ), primary_weapons );
1315 
1316  ArrayRemoveValue( offhand_weapons_and_alts, level.weaponBaseMelee );
1317 
1318  player playsound( "wpn_ammo_pickup" );
1319  player playlocalsound( "wpn_ammo_pickup" );
1320  //player _properks::scavenged();
1321 
1322 
1323  player.scavenger_icon.alpha = 1;
1324  player.scavenger_icon fadeOverTime( 2.5 );
1325  player.scavenger_icon.alpha = 0;
1326  scavenger_lethal_proc = 1; // extra bags to pick up before lethal refill
1327  scavenger_tactical_proc = 1; // extra bags to pick up before tactical refill
1328 
1329  if (!isdefined(player.scavenger_lethal_proc))
1330  {
1331  player.scavenger_lethal_proc = 0;
1332  player.scavenger_tactical_proc = 0;
1333  }
1334 
1335  loadout_primary = player ‪loadout_get_offhand_weapon( "primarygrenade" );
1336  loadout_primary_count = player ‪loadout_get_offhand_count( "primarygrenadecount" );
1337  loadout_secondary = player ‪loadout_get_offhand_weapon( "specialgrenade" );
1338  loadout_secondary_count = player ‪loadout_get_offhand_count( "specialgrenadeCount" );
1339 
1340  for ( i = 0; i < offhand_weapons_and_alts.size; i++ )
1341  {
1342  weapon = offhand_weapons_and_alts[i];
1343 
1344  if ( !weapon.isScavengable )
1345  {
1346  continue;
1347  }
1348 
1349  switch ( weapon.name )
1350  {
1351  case "frag_grenade":
1352  case "claymore":
1353  case "sticky_grenade":
1354  case "satchel_charge":
1355  case "hatchet":
1356  case "bouncingbetty":
1357  if ( isdefined( player.grenadeTypePrimaryCount ) && player.grenadeTypePrimaryCount < 1 )
1358  break;
1359 
1360  if (player GetWeaponAmmoStock( weapon ) != loadout_primary_count)
1361  {
1362  if (player.scavenger_lethal_proc < scavenger_lethal_proc )
1363  {
1364  player.scavenger_lethal_proc++;
1365  break;
1366  }
1367  player.scavenger_lethal_proc = 0;
1368  player.scavenger_tactical_proc = 0; // dont ever refill both grenades at the same time
1369  }
1370  // fall through
1371  case "proximity_grenade":
1372  case "flash_grenade":
1373  case "concussion_grenade":
1374  case "tabun_gas":
1375  case "nightingale":
1376  case "emp_grenade":
1377  case "willy_pete":
1378  case "trophy_system":
1379  case "sensor_grenade":
1380  case "pda_hack":
1381  if ( isdefined( player.grenadeTypeSecondaryCount ) && player.grenadeTypeSecondaryCount < 1 )
1382  break;
1383 
1384  if (weapon == loadout_secondary && player GetWeaponAmmoStock( weapon ) != loadout_secondary_count)
1385  {
1386  if (player.scavenger_tactical_proc < scavenger_tactical_proc )
1387  {
1388  player.scavenger_tactical_proc++;
1389  break;
1390  }
1391  player.scavenger_tactical_proc = 0;
1392  player.scavenger_lethal_proc = 0; // dont ever refill both grenades at the same time
1393  }
1394 
1395  maxAmmo = weapon.maxAmmo;
1396 
1397  // just give 1 for each scavenger pick up
1398  stock = player GetWeaponAmmoStock( weapon );
1399 
1400  if ( isdefined( level.customLoadoutScavenge ) )
1401  {
1402  maxAmmo = self [[level.customLoadoutScavenge]]( weapon );
1403  }
1404  else if ( weapon == loadout_primary )
1405  {
1406  maxAmmo = loadout_primary_count;
1407  }
1408  else if ( weapon == loadout_secondary )
1409  {
1410  maxAmmo = loadout_secondary_count;
1411  }
1412 
1413  if ( stock < maxAmmo )
1414  {
1415  ammo = stock + 1;
1416  if ( ammo > maxAmmo )
1417  {
1418  ammo = maxAmmo;
1419  }
1420  player SetWeaponAmmoStock( weapon, ammo );
1421 
1422  player thread ‪challenges::scavengedGrenade();
1423  }
1424  break;
1425 
1426  default:
1427  if ( weapon.isLauncherWeapon )
1428  {
1429  stock = player GetWeaponAmmoStock( weapon );
1430  start = player GetFractionStartAmmo( weapon );
1431  clip = weapon.clipSize;
1432  clip *= GetDvarFloat( "scavenger_clip_multiplier", 2 );
1433  clip = Int( clip );
1434  maxAmmo = weapon.maxAmmo;
1435 
1436  if ( stock < maxAmmo - clip )
1437  {
1438  ammo = stock + clip;
1439  player SetWeaponAmmoStock( weapon, ammo );
1440  }
1441  else
1442  {
1443  player SetWeaponAmmoStock( weapon, maxAmmo );
1444  }
1445  }
1446  break;
1447  }
1448  }
1449 
1450  for ( i = 0; i < primary_weapons.size; i++ )
1451  {
1452  weapon = primary_weapons[i];
1453 
1454  if ( !weapon.isScavengable )
1455  {
1456  continue;
1457  }
1458 
1459  stock = player GetWeaponAmmoStock( weapon );
1460  start = player GetFractionStartAmmo( weapon );
1461  clip = weapon.clipSize;
1462  clip *= GetDvarFloat( "scavenger_clip_multiplier", 2 );
1463  clip = Int( clip );
1464  maxAmmo = weapon.maxAmmo;
1465 
1466  if ( stock < maxAmmo - clip )
1467  {
1468  ammo = stock + clip;
1469  player SetWeaponAmmoStock( weapon, ammo );
1470  }
1471  else
1472  {
1473  player SetWeaponAmmoStock( weapon, maxAmmo );
1474  }
1475  }
1476 }
1477 
1479 {
1480  if( level.wagerMatch )
1481  return;
1482 
1483  self.scavenger_icon = NewClientHudElem( self );
1484  self.scavenger_icon.horzAlign = "center";
1485  self.scavenger_icon.vertAlign = "middle";
1486  self.scavenger_icon.x = -16;
1487  self.scavenger_icon.y = 16;
1488  self.scavenger_icon.alpha = 0;
1489 
1490  width = 32;
1491  height = 16;
1492 
1493  if ( self IsSplitscreen() )
1494  {
1495  width = Int( width * 0.5 );
1496  height = Int( height * 0.5 );
1497  self.scavenger_icon.x = -8;
1498  }
1499 
1500  self.scavenger_icon setShader( "hud_scavenger_pickup", width, height );
1501 }
1502 
1503 function ‪dropScavengerForDeath( attacker )
1504 {
1505  if( SessionModeIsZombiesGame() )
1506  return;
1507 
1508  if( level.wagerMatch )
1509  return;
1510 
1511  if( !isdefined( attacker ) )
1512  return;
1513 
1514  if( attacker == self )
1515  return;
1516 
1517  if ( level.gameType == "hack" )
1518  {
1519  item = self dropScavengerItem( GetWeapon( "scavenger_item_hack" ) );
1520  }
1521  else
1522  {
1523  item = self dropScavengerItem( GetWeapon( "scavenger_item" ) );
1524  }
1525 
1526  item thread ‪scavenger_think();
1527 }
1528 
1529 
1530 // if we need to store multiple drop limited weapons, we'll need to store an array on the player entity
1531 function ‪addLimitedWeapon( weapon, owner, num_drops )
1532 {
1533  limited_info = SpawnStruct();
1534  limited_info.weapon = weapon;
1535  limited_info.drops = num_drops;
1536 
1537  owner.limited_info = limited_info;
1538 }
1539 
1540 function ‪shouldDropLimitedWeapon( weapon, owner )
1541 {
1542  limited_info = owner.limited_info;
1543 
1544  if ( !isdefined( limited_info ) )
1545  {
1546  return true;
1547  }
1548 
1549  if ( limited_info.weapon != weapon )
1550  {
1551  return true;
1552  }
1553 
1554  if ( limited_info.drops <= 0 )
1555  {
1556  return false;
1557  }
1558 
1559  return true;
1560 }
1561 
1562 
1563 function ‪dropLimitedWeapon( weapon, owner, item )
1564 {
1565  limited_info = owner.limited_info;
1566 
1567  if ( !isdefined( limited_info ) )
1568  {
1569  return;
1570  }
1571 
1572  if ( limited_info.weapon != weapon )
1573  {
1574  return;
1575  }
1576 
1577  limited_info.drops = limited_info.drops - 1;
1578  owner.limited_info = undefined;
1579 
1580  item thread ‪limitedPickup( limited_info );
1581 }
1582 
1583 
1584 function ‪limitedPickup( limited_info )
1585 {
1586  self endon( "death" );
1587  self waittill( "trigger", player, item );
1588 
1589  if ( !isdefined( item ) )
1590  {
1591  return;
1592  }
1593 
1594  player.limited_info = limited_info;
1595 }
‪damageEnt
‪function damageEnt(eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, damagepos, damagedir)
Definition: _weapons.gsc:1042
‪watchForThrowbacks
‪function watchForThrowbacks()
Definition: _weapons.gsc:790
‪watchForGrenadeLauncherDuds
‪function watchForGrenadeLauncherDuds()
Definition: _weapons.gsc:896
‪scavenger_think
‪function scavenger_think()
Definition: _weapons.gsc:1471
‪startTime
‪class AnimationAdjustmentInfoZ startTime
‪is_bot
‪function is_bot()
Definition: util_shared.gsc:2488
‪is_side_arm
‪function is_side_arm(weapon)
Definition: weapons_shared.gsc:20
‪watchMissileUsage
‪function watchMissileUsage()
Definition: _weapons.gsc:543
‪deletePickupAfterAWhile
‪function deletePickupAfterAWhile()
Definition: _weapons.gsc:346
‪scavengedGrenade
‪function scavengedGrenade()
Definition: challenges_shared.gsc:1484
‪watchWeaponUsage
‪function watchWeaponUsage()
Definition: _weapons.gsc:410
‪detonate
‪function detonate(attacker)
Definition: vehicle_ai_shared.gsc:1650
‪launch
‪function launch(ent_1, str_tag1, ent_2, str_tag2, str_beam_type)
Definition: beam_shared.csc:11
‪onWeaponDamage
‪function onWeaponDamage(eAttacker, eInflictor, weapon, meansOfDeath, damage)
Definition: _weapons.gsc:1115
‪waittill_any_return
‪function waittill_any_return(string1, string2, string3, string4, string5, string6, string7)
Definition: util_shared.csc:212
‪stow_on_back
‪function stow_on_back(current)
Definition: weapons_shared.gsc:92
‪updateWeaponTimings
‪function updateWeaponTimings(newTime)
Definition: _weapons.gsc:133
‪dropGrenadesToGround
‪function dropGrenadesToGround(origin, radius)
Definition: _weapons.gsc:581
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪updateLastHeldWeaponTimings
‪function updateLastHeldWeaponTimings(newTime)
Definition: _weapons.gsc:120
‪deleteEntOnOwnerDeath
‪function deleteEntOnOwnerDeath(owner)
Definition: _weapons.gsc:1186
‪mayDropWeapon
‪function mayDropWeapon(weapon)
Definition: _weapons.gsc:261
‪watchGrenadeCancel
‪function watchGrenadeCancel()
Definition: _weapons.gsc:593
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪registerKillstreakDelay
‪function registerKillstreakDelay(dvarString, defaultValue, minValue, maxValue)
Definition: _weapons.gsc:847
‪registerGrenadeLauncherDudDvar
‪function registerGrenadeLauncherDudDvar(dvarString, defaultValue, minValue, maxValue)
Definition: _weapons.gsc:813
‪a
‪function add_remove_list a
Definition: util_shared.csc:906
‪debugline
‪function debugline(a, b, color)
Definition: _weapons.gsc:1247
‪init
‪function init()
Definition: _weapons.gsc:55
‪damage_notify_wrapper
‪function damage_notify_wrapper(damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags)
Definition: util_shared.gsc:1076
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪watchForGrenadeDuds
‪function watchForGrenadeDuds()
Definition: _weapons.gsc:884
‪addLimitedWeapon
‪function addLimitedWeapon(weapon, owner, num_drops)
Definition: _weapons.gsc:1531
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪updateStowedWeapon
‪function updateStowedWeapon()
Definition: _weapons.gsc:1196
‪loadout_get_class_num
‪function loadout_get_class_num()
Definition: _weapons.gsc:1257
‪checkStuckToPlayer
‪function checkStuckToPlayer(deleteOnTeamChange, awardScoreEvent, weapon)
Definition: _weapons.gsc:743
‪beginGrenadeTracking
‪function beginGrenadeTracking()
Definition: _weapons.gsc:645
‪detach_all_weapons
‪function detach_all_weapons()
Definition: weapons_shared.gsc:55
‪onPlayerSpawned
‪function onPlayerSpawned()
Definition: _weapons.gsc:55
‪beginOtherGrenadeTracking
‪function beginOtherGrenadeTracking()
Definition: _weapons.gsc:687
‪is_primary_weapon
‪function is_primary_weapon(weapon)
Definition: weapons_shared.gsc:15
‪getTimePassed
‪function getTimePassed()
Definition: _globallogic_utils.gsc:274
‪dropLimitedWeapon
‪function dropLimitedWeapon(weapon, owner, item)
Definition: _weapons.gsc:1563
‪shouldDropLimitedWeapon
‪function shouldDropLimitedWeapon(weapon, owner)
Definition: _weapons.gsc:1540
‪is_inventory
‪function is_inventory(weapon)
Definition: weapons_shared.gsc:25
‪checkHatchetBounce
‪function checkHatchetBounce()
Definition: _weapons.gsc:764
‪limitedPickup
‪function limitedPickup(limited_info)
Definition: _weapons.gsc:1584
‪loadout_get_offhand_weapon
‪function loadout_get_offhand_weapon(stat)
Definition: _weapons.gsc:1425
‪stow_on_hip
‪function stow_on_hip()
Definition: weapons_shared.gsc:132
‪stuckToPlayerTeamChange
‪function stuckToPlayerTeamChange(player)
Definition: _weapons.gsc:772
‪turnGrenadeIntoADud
‪function turnGrenadeIntoADud(weapon, isThrownGrenade, player)
Definition: _weapons.gsc:861
‪registerThrownGrenadeDudDvar
‪function registerThrownGrenadeDudDvar(dvarString, defaultValue, minValue, maxValue)
Definition: _weapons.gsc:830
‪watch_offhand_end
‪function watch_offhand_end()
Definition: _weapons.gsc:708
‪watchRiotShieldUse
‪function watchRiotShieldUse()
Definition: _weapons.gsc:105
‪watchMissileDeath
‪function watchMissileDeath()
Definition: _weapons.gsc:562
‪is_grenade
‪function is_grenade(weapon)
Definition: weapons_shared.gsc:30
‪scavenger_hud_create
‪function scavenger_hud_create()
Definition: _weapons.gsc:1590
‪trackWeaponFire
‪function trackWeaponFire(curWeapon)
Definition: _weapons.gsc:465
‪watchPickup
‪function watchPickup()
Definition: _weapons.gsc:358
‪loadout_get_offhand_count
‪function loadout_get_offhand_count(stat)
Definition: _weapons.gsc:1446
‪onPlayerConnect
‪function onPlayerConnect()
Definition: _weapons.gsc:40
‪getDamageableEnts
‪function getDamageableEnts(pos, radius, doLOS, startRadius)
Definition: _weapons.gsc:919
‪is_using_offhand_equipment
‪function is_using_offhand_equipment()
Definition: _weapons.gsc:729
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪mayApplyScreenEffect
‪function mayApplyScreenEffect()
Definition: util_shared.gsc:2613
‪playConcussionSound
‪function playConcussionSound(duration)
Definition: _weapons.gsc:1165
‪dropScavengerForDeath
‪function dropScavengerForDeath(attacker)
Definition: _weapons.gsc:1503
‪watchGrenadeUsage
‪function watchGrenadeUsage()
Definition: _weapons.gsc:508
‪dropWeaponsToGround
‪function dropWeaponsToGround(origin, radius)
Definition: _weapons.gsc:568
‪watchWeaponChange
‪function watchWeaponChange()
Definition: _weapons.gsc:82
‪trackWeapon
‪function trackWeapon()
Definition: _weapons.gsc:226
‪dropWeaponForDeath
‪function dropWeaponForDeath(attacker)
Definition: _weapons.gsc:275
‪weaponDamageTracePassed
‪function weaponDamageTracePassed(from, to, startRadius, ignore)
Definition: weapons_shared.gsc:155
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265