‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
challenges_shared.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\abilities\_ability_player;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\drown;
6 #using scripts\shared\scoreevents_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\abilities\_ability_util;
10 
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\abilities\_ability_util.gsh;
13 
14 #namespace challenges;
15 
16 function ‪init_shared()
17 {
18 }
19 
21 {
22  self.retreivedBlades++;
23 }
24 
25 // used to be in _helicopter.gsc
26 function ‪trackAssists( attacker, ‪damage, isFlare )
27 {
28  if ( !isdefined( self.flareAttackerDamage ) )
29  {
30  self.flareAttackerDamage = [];
31  }
32 
33  if ( isdefined ( isFlare ) && isFlare == true )
34  {
35  self.flareAttackerDamage[attacker.clientid] = true;
36  }
37  else
38  {
39  self.flareAttackerDamage[attacker.clientid] = false;
40  }
41 }
42 
43 function ‪destroyedEquipment( weapon )
44 {
45  if ( IsDefined( weapon ) && weapon.isEmp )
46  {
47  if ( self ‪util::is_item_purchased( "emp_grenade" ) )
48  {
49  self AddPlayerStat( "destroy_equipment_with_emp_grenade", 1 );
50  }
51  self AddWeaponStat( weapon, "combatRecordStat", 1 );
53  {
54  self AddPlayerStat( "destroy_equipment_with_emp_engineer", 1 );
55  self AddPlayerStat( "destroy_equipment_engineer", 1 );
56  }
57  }
59  {
60  self AddPlayerStat( "destroy_equipment_engineer", 1 );
61  }
62  self AddPlayerStat( "destroy_equipment", 1 );
63 
64  if ( IsDefined( weapon ) && weapon.isBulletWeapon )
65  {
66  self AddPlayerStat( "destroy_equipment_with_bullet", 1 );
67  }
68 
70 }
71 
73 {
74  if ( !isdefined( self.pers["tacticalInsertsDestroyed"] ) )
75  {
76  self.pers["tacticalInsertsDestroyed"] = 0;
77  }
78  self.pers["tacticalInsertsDestroyed"]++;
79  if ( self.pers["tacticalInsertsDestroyed"] >= 5 )
80  {
81  self.pers["tacticalInsertsDestroyed"] = 0;
82  self AddPlayerStat( "destroy_5_tactical_inserts", 1 );
83  }
84 }
85 
86 function ‪addFlySwatterStat( weapon, aircraft )
87 {
88  if ( !isdefined( self.pers[ "flyswattercount" ] ) )
89  {
90  self.pers[ "flyswattercount" ] = 0;
91  }
92 
93  self AddWeaponStat( weapon, "destroyed_aircraft", 1 );
94 
95  self.pers[ "flyswattercount" ]++;
96 
97  if ( self.pers[ "flyswattercount" ] == 5 )
98  {
99  self AddWeaponStat( weapon, "destroyed_5_aircraft", 1 );
100  }
101 
102  if ( isdefined( aircraft ) && isdefined( aircraft.birthTime ) )
103  {
104  if ( ( GetTime() - aircraft.birthTime ) < 20000 )
105  {
106  self AddWeaponStat( weapon, "destroyed_aircraft_under20s", 1 );
107  }
108  }
109 
110  if ( !isdefined( self.destroyedAircraftTime ) )
111  {
112  self.destroyedAircraftTime = [];
113  }
114 
115  if ( ( isdefined( self.destroyedAircraftTime[ weapon ] ) ) && ( ( GetTime() - self.destroyedAircraftTime[ weapon ] ) < 10000 ) )
116  {
117  self AddWeaponStat( weapon, "destroyed_2aircraft_quickly", 1 );
118  self.destroyedAircraftTime[ weapon ] = undefined;
119  }
120  else
121  {
122  self.destroyedAircraftTime[ weapon ] = GetTime();
123  }
124 }
125 
127 {
128  // this function is being used to add weapon stat using "destroyed_aircraft" since we cannot change the statsmilestone3.csv
129 
130  self AddWeaponStat( weapon, "destroyed_aircraft", 1 ); // "destroyed_aircraft" now means any destroyed killstreak
131 }
132 
134 {
135 /#
136  if ( GetDvarInt( "scr_debug_challenges", 0 ) )
137  return true;
138 #/
139 
140  if ( level.rankedMatch || level.arenaMatch || level.wagerMatch || SessionModeIsCampaignGame() )
141  {
142  return true;
143  }
144 
145  return false;
146 }
147 
148 
149 function ‪initTeamChallenges( team )
150 {
151  if ( !isdefined( game["challenge"] ) )
152  {
153  game["challenge"] = [];
154  }
155 
156  if ( !isdefined ( game["challenge"][team] ) )
157  {
158  game["challenge"][team] = [];
159  game["challenge"][team]["plantedBomb"] = false;
160  game["challenge"][team]["destroyedBombSite"] = false;
161  game["challenge"][team]["capturedFlag"] = false;
162  }
163  game["challenge"][team]["allAlive"] = true;
164 }
165 
167 {
168  if (!isdefined(level.ChallengesCallbacks[‪callback]))
169  level.ChallengesCallbacks[‪callback] = [];
170  level.ChallengesCallbacks[‪callback][level.ChallengesCallbacks[‪callback].size] = func;
171 }
172 
174 {
175  if ( !isdefined( level.ChallengesCallbacks ) )
176  return;
177 
178  if ( !isdefined( level.ChallengesCallbacks[‪callback] ) )
179  return;
180 
181  if ( isdefined( data ) )
182  {
183  for ( i = 0; i < level.ChallengesCallbacks[‪callback].size; i++ )
184  thread [[level.ChallengesCallbacks[‪callback][i]]]( data );
185  }
186  else
187  {
188  for ( i = 0; i < level.ChallengesCallbacks[‪callback].size; i++ )
189  thread [[level.ChallengesCallbacks[‪callback][i]]]();
190  }
191 }
192 
194 {
195  self thread ‪initChallengeData();
196  self thread ‪spawnWatcher();
197  self thread ‪monitorReloads();
198 }
199 
201 {
202  self endon("disconnect");
203  self endon("killMonitorReloads");
204 
205  while(1)
206  {
207  self waittill("reload");
208  currentWeapon = self getCurrentWeapon();
209  if ( currentWeapon == level.weaponNone )
210  {
211  continue;
212  }
213 
214  time = getTime();
215  self.lastReloadTime = time;
216 
217  if ( WeaponHasAttachment( currentWeapon, "supply" ) || WeaponHasAttachment( currentWeapon, "dualclip" ) )
218  {
219  self thread ‪reloadThenKill( currentWeapon );
220  }
221  }
222 }
223 
224 function ‪reloadThenKill( reloadWeapon )
225 {
226  self endon( "disconnect" );
227  self endon( "death" );
228  self endon( "reloadThenKillTimedOut" );
229  self notify( "reloadThenKillStart" ); // kill dupliate self and duplicate timeout
230  self endon( "reloadThenKillStart" ); // Singleton
231 
232  self thread ‪reloadThenKillTimeOut( 5 );
233 
234  for( ;; )
235  {
236  self waittill ("killed_enemy_player", time, weapon );
237  if ( reloadWeapon == weapon )
238  {
239  self AddPlayerStat( "reload_then_kill_dualclip", 1 );
240  }
241  }
242 }
243 
244 
245 function ‪reloadThenKillTimeOut( time )
246 {
247  self endon( "disconnect" );
248  self endon( "death" );
249  self endon( "reloadThenKillStart" );
250  wait( time );
251  self notify( "reloadThenKillTimedOut" );
252 }
253 
255 {
256  self.pers["bulletStreak"] = 0;
257  self.pers["lastBulletKillTime"] = 0;
258  self.pers["stickExplosiveKill"] = 0;
259  self.pers["carepackagesCalled"] = 0;
260  self.explosiveInfo = [];
261 }
262 
263 
264 function ‪isDamageFromPlayerControlledAITank( eAttacker, eInflictor, weapon )
265 {
266  if ( weapon.name == "ai_tank_drone_gun" )
267  {
268  if ( isdefined( eAttacker ) && isdefined( eAttacker.remoteWeapon ) && isdefined( eInflictor ) )
269  {
270  if ( ‪IS_TRUE( eInflictor.controlled ) )
271  {
272  if ( eAttacker.remoteWeapon == eInflictor )
273  {
274  return true;
275  }
276  }
277  }
278  }
279  else if ( weapon.name == "ai_tank_drone_rocket" )
280  {
281  if ( isdefined( eInflictor ) && !isdefined( eInflictor.from_ai ) )
282  {
283  return true;
284  }
285  }
286  return false;
287 }
288 
289 function ‪isDamageFromPlayerControlledSentry( eAttacker, eInflictor, weapon )
290 {
291  if ( weapon.name == "auto_gun_turret" )
292  {
293  if ( isdefined( eAttacker ) && isdefined( eAttacker.remoteWeapon ) && isdefined( eInflictor ) )
294  {
295  if ( eAttacker.remoteWeapon == eInflictor )
296  {
297  if ( ‪IS_TRUE( eInflictor.controlled ) )
298  {
299  return true;
300  }
301  }
302  }
303  }
304  return false;
305 }
306 
307 function ‪perkKills( victim, ‪isStunned, time )
308 {
309  player = self;
310  if ( player hasPerk( "specialty_movefaster" ) )
311  {
312  player AddPlayerStat( "perk_movefaster_kills", 1 );
313  }
314  if ( player hasPerk( "specialty_noname" ) )
315  {
316  player AddPlayerStat( "perk_noname_kills", 1 );
317  }
318  if ( player hasPerk( "specialty_quieter" ) )
319  {
320  player AddPlayerStat( "perk_quieter_kills", 1 );
321  }
322  if ( player hasPerk( "specialty_longersprint" ) )
323  {
324  if ( isdefined ( player.lastSprintTime ) && ( GetTime() - player.lastSprintTime ) < 2500 )
325  {
326  player AddPlayerStat( "perk_longersprint", 1 );
327  }
328  }
329  if ( player hasPerk( "specialty_fastmantle" ) )
330  {
331  if ( ( isdefined ( player.lastSprintTime ) && ( GetTime() - player.lastSprintTime ) < 2500 ) && ( player PlayerAds() >= 1 ) )
332  {
333  player AddPlayerStat( "perk_fastmantle_kills", 1 );
334  }
335  }
336  if ( player hasPerk( "specialty_loudenemies" ) )
337  {
338  player AddPlayerStat( "perk_loudenemies_kills", 1 );
339  }
340 
341  if ( ‪isStunned == true && player hasPerk( "specialty_stunprotection" ) )
342  {
343  player AddPlayerStat( "perk_protection_stun_kills", 1 );
344  }
345 
346  activeEnemyEmp = false;
347  activeCUAV = false ;
348  if ( level.teambased )
349  {
350  foreach( team in level.teams )
351  {
352  assert( isdefined( level.activeCounterUAVs[ team ] ) );
353  assert( isdefined( level.ActiveEMPs[ team ] ) );
354 
355  if ( team == player.team )
356  {
357  continue;
358  }
359 
360  if ( level.activeCounterUAVs[team] > 0 )
361  {
362  activeCUAV = true;
363  }
364 
365  if( level.ActiveEMPs[ team ] > 0 )
366  {
367  activeEnemyEmp = true;
368  }
369  }
370  }
371  else
372  {
373  assert( isdefined( level.activeCounterUAVs[ victim.entNum ] ) );
374  assert( isdefined( level.ActiveEMPs[ victim.entNum ] ) );
375 
376  players = level.players;
377  for ( i = 0; i < players.size; i++ )
378  {
379  if ( players[i] != player )
380  {
381  if ( isdefined( level.activeCounterUAVs[players[i].entNum] ) && level.activeCounterUAVs[players[i].entNum] > 0 )
382  {
383  activeCUAV = true;
384  }
385 
386  if( isdefined( level.ActiveEMPs[ players[ i ].entNum ] ) && level.ActiveEMPs[ players[ i ].entNum ] > 0 )
387  {
388  activeEnemyEmp = true;
389  }
390  }
391  }
392  }
393 
394  if ( activeCUAV == true || activeEnemyEmp == true )
395  {
396  if ( player hasPerk( "specialty_immunecounteruav" ) )
397  {
398  player AddPlayerStat( "perk_immune_cuav_kills", 1 );
399  }
400  }
401 
402  activeUAVVictim = false;
403  if ( level.teambased )
404  {
405  if ( level.activeUAVs[victim.team] > 0 )
406  {
407  activeUAVVictim = true;
408  }
409  }
410  else
411  {
412  activeUAVVictim = ( isdefined( level.activeUAVs[victim.entNum] ) && level.activeUAVs[victim.entNum] > 0 );
413  }
414 
415 
416  if ( activeUAVVictim == true )
417  {
418  if ( player hasPerk( "specialty_gpsjammer" ) )
419  {
420  player AddPlayerStat( "perk_gpsjammer_immune_kills", 1 );
421  }
422  }
423 
424  if ( player.lastWeaponChange + 5000 > time )
425  {
426  if ( player hasPerk( "specialty_fastweaponswitch" ) )
427  {
428  player AddPlayerStat( "perk_fastweaponswitch_kill_after_swap", 1 );
429  }
430  }
431 
432  if ( player.scavenged == true )
433  {
434  if ( player hasPerk( "specialty_scavenger" ) )
435  {
436  player AddPlayerStat( "perk_scavenger_kills_after_resupply", 1 );
437  }
438  }
439 }
440 
441 function ‪flakjacketProtected( weapon, attacker )
442 {
443  if ( weapon.name == "claymore" )
444  {
445  self.flakJacketClaymore[ attacker.clientid ] = true;
446  }
447  self AddPlayerStat( "survive_with_flak", 1 );
448  self.challenge_lastsurvivewithflakfrom = attacker;
449  self.challenge_lastsurvivewithflaktime = getTime();
450 }
451 
453 {
454  if ( self ‪util::has_purchased_perk_equipped( "specialty_anteup" ) ) // anteup
455  {
456  self AddPlayerStat( "earn_scorestreak_anteup", 1 );
457  if ( !isdefined( self.challenge_anteup_earned ) )
458  {
459  self.challenge_anteup_earned = 0;
460  }
461  self.challenge_anteup_earned++;
462  if ( self.challenge_anteup_earned >= 5 )
463  {
464  self AddPlayerStat( "earn_5_scorestreaks_anteup", 1 );
465  self.challenge_anteup_earned = 0;
466  }
467  }
468 }
469 
470 function ‪genericBulletKill( data, victim, weapon )
471 {
472  player = self;
473  time = data.time;
474 
475  if ( player.pers["lastBulletKillTime"] == time )
476  player.pers["bulletStreak"]++;
477  else
478  player.pers["bulletStreak"] = 1;
479 
480  player.pers["lastBulletKillTime"] = time;
481 
482  if ( data.victim.iDFlagsTime == time )
483  {
484  if ( data.victim.iDFlags & ‪IDFLAGS_PENETRATION )
485  {
486  player AddPlayerStat( "kill_enemy_through_wall", 1 );
487  if ( isdefined( weapon ) && weaponHasAttachment( weapon, "fmj" ) )
488  {
489  player AddPlayerStat( "kill_enemy_through_wall_with_fmj", 1 );
490  }
491  }
492  }
493 
494 }
495 
496 
497 function ‪isHighestScoringPlayer( player )
498 {
499  if ( !isdefined( player.score ) || player.score < 1 )
500  return false;
501 
502  players = level.players;
503  if ( level.teamBased )
504  team = player.pers["team"];
505  else
506  team = "all";
507 
508  highScore = player.score;
509 
510  for( i = 0; i < players.size; i++ )
511  {
512  if ( !isdefined( players[i].score ) )
513  continue;
514 
515  if ( players[i] == player )
516  continue;
517 
518  if ( players[i].score < 1 )
519  continue;
520 
521  if ( team != "all" && players[i].pers["team"] != team )
522  continue;
523  // tied for first is no longer counted
524  if ( players[i].score >= highScore )
525  return false;
526  }
527 
528  return true;
529 }
530 
531 function ‪spawnWatcher()
532 {
533  self endon("disconnect");
534  self endon("killSpawnMonitor");
535  self.pers["stickExplosiveKill"] = 0;
536  self.pers["pistolHeadshot"] = 0;
537  self.pers["assaultRifleHeadshot"] = 0;
538  self.pers["killNemesis"] = 0;
539  while(1)
540  {
541  self waittill("spawned_player");
542  self.pers["longshotsPerLife"] = 0;
543  self.flakJacketClaymore = [];
544  self.weaponKills = [];
545  self.attachmentKills = [];
546  self.retreivedBlades = 0;
547  self.lastReloadTime = 0;
548  self.crossbowClipKillCount = 0;
549  self thread ‪watchForDTP();
550  self thread ‪watchForMantle();
551  self thread ‪monitor_player_sprint();
552  }
553 }
554 
555 function ‪watchForDTP()
556 {
557  self endon ( "disconnect" );
558  self endon ( "death" );
559  self endon ("killDTPMonitor");
560 
561  self.dtpTime = 0;
562  while(1)
563  {
564  self waittill( "dtp_end" );
565  self.dtpTime = getTime() + 4000;
566  }
567 }
568 
569 
571 {
572  self endon ( "disconnect" );
573  self endon ( "death" );
574  self endon ("killMantleMonitor");
575 
576  self.mantleTime = 0;
577  while(1)
578  {
579  self waittill( "mantle_start", mantleEndTime );
580  self.mantleTime = mantleEndTime;
581  }
582 }
583 
585 {
586  self AddPlayerStat( "disarm_hacked_carepackage", 1 );
587 }
588 
590 {
591  if ( !isdefined( self ) || !isplayer( self ) )
592  return;
593 
594  self AddPlayerStat( "destroy_car", 1 );
595 }
596 
597 
599 {
600  self.pers["killNemesis"]++;
601  if ( self.pers["killNemesis"] >= 5 )
602  {
603  self.pers["killNemesis"] = 0;
604  self AddPlayerStat( "kill_nemesis", 1 );
605  }
606 }
607 
609 {
610  self AddPlayerStat( "kill_while_damaging_with_microwave_turret", 1 );
611 }
612 
614 {
615  self AddPlayerStat( "long_distance_hatchet_kill", 1 );
616 }
617 
619 {
620  self AddPlayerStat( "activate_cuav_while_enemy_satelite_active", 1 );
621 }
622 
624 {
625  self.pers["longshotsPerLife"]++;
626  if ( self.pers["longshotsPerLife"] >= 3 )
627  {
628  self.pers["longshotsPerLife"] = 0;
629  self AddPlayerStat( "longshot_3_onelife", 1 );
630  }
631 }
632 
633 
634 function ‪challengeRoundEnd( data )
635 {
636  player = data.player;
637  winner = data.winner;
638 
639  if ( ‪endedEarly( winner ) )
640  return;
641 
642  if ( level.teambased )
643  {
644  winnerScore = game["teamScores"][winner];
645  loserScore = ‪getLosersTeamScores( winner );
646  }
647 
648  switch ( level.gameType )
649  {
650 
651  case "sd":
652  {
653  if ( player.team == winner )
654  {
655  if ( game["challenge"][winner]["allAlive"] )
656  {
657  player AddGameTypeStat( "round_win_no_deaths", 1 );
658  }
659  if ( isdefined ( player.lastManSDDefeat3Enemies ) )
660  {
661  player AddGameTypeStat( "last_man_defeat_3_enemies", 1 );
662  }
663  }
664  }
665  break;
666  default:
667  break;
668  }
669 }
670 
671 
672 function ‪roundEnd( winner )
673 {
675  data = spawnstruct();
676  data.time = getTime();
677  if ( level.teamBased )
678  {
679  if ( isdefined( winner ) && isdefined( level.teams[winner] ) )
680  {
681  data.winner = winner;
682  }
683  }
684  else
685  {
686  if ( isdefined( winner ) )
687  {
688  data.winner = winner;
689  }
690  }
691 
692 
693  for ( index = 0; index < level.placement["all"].size; index++ )
694  {
695  data.player = level.placement["all"][index];
696  if ( isdefined( data.player ) )
697  {
698  data.place = index;
699  ‪doChallengeCallback( "roundEnd", data );
700  }
701  }
702 }
703 
704 function ‪gameEnd( winner )
705 {
707  data = spawnstruct();
708  data.time = getTime();
709  if ( level.teamBased )
710  {
711  if ( isdefined( winner ) && isdefined( level.teams[winner] ) )
712  {
713  data.winner = winner;
714  }
715  }
716  else
717  {
718  if ( isdefined( winner ) && isplayer( winner) )
719  {
720  data.winner = winner;
721  }
722  }
723 
724 
725  for ( index = 0; index < level.placement["all"].size; index++ )
726  {
727  data.player = level.placement["all"][index];
728  data.place = index;
729 
730  if ( isdefined( data.player ) )
731  {
732  ‪doChallengeCallback( "gameEnd", data );
733  }
734  data.player.completedGame = true;
735  }
736 
737  for( index = 0; index < level.players.size; index++ )
738  {
739  if ( !isdefined( level.players[index].completedGame ) || level.players[index].completedGame != true )
740  {
741  ‪scoreevents::processScoreEvent( "completed_match", level.players[index] );
742  }
743  }
744 }
745 
746 function ‪getFinalKill( player )
747 {
748  // if the crates in dockside get the final killcam.
749  if ( isplayer ( player ) )
750  {
751  player AddPlayerStat( "get_final_kill", 1 );
752  }
753 }
754 
755 function ‪destroyRCBomb( weapon )
756 {
757  if ( !IsPlayer( self ) )
758  return;
759 
760  self ‪destroyScoreStreak( weapon, true, true );
761  if ( weapon.rootweapon.name == "hatchet" )
762  {
763  self AddPlayerStat( "destroy_hcxd_with_hatchet", 1 );
764  }
765 }
766 
767 function ‪capturedCrate( owner )
768 {
769  if ( isdefined ( self.lastRescuedBy ) && isdefined ( self.lastRescuedTime ) )
770  {
771  if ( self.lastRescuedTime + 5000 > getTime() )
772  {
773  self.lastRescuedBy AddPlayerStat( "defend_teammate_who_captured_package", 1 );
774  }
775  }
776 
777  if( owner != self && ((level.teambased && owner.team != self.team) || !level.teambased) )
778  {
779  self AddPlayerStat( "capture_enemy_carepackage", 1 );
780  }
781 
782 }
783 
784 function ‪destroyScoreStreak( weapon, playerControlled, groundBased, countAsKillstreakVehicle = true )
785 {
786  if ( !IsPlayer( self ) )
787  return;
788 
789  if ( isdefined( level.killstreakWeapons[weapon] ) )
790  {
791  if ( level.killstreakWeapons[weapon] == "dart" )
792  {
793  self AddPlayerStat( "destroy_scorestreak_with_dart", 1 );
794  }
795  }
796  else if ( isdefined( weapon.isHeroWeapon ) && weapon.isHeroWeapon == true )
797  {
798  self AddPlayerStat( "destroy_scorestreak_with_specialist", 1 );
799  }
800  else if ( WeaponHasAttachment( weapon, "fmj", "rf" ) )
801  {
802  self AddPlayerStat( "destroy_scorestreak_rapidfire_fmj", 1 );
803  }
804 
805  if ( !isdefined( playerControlled ) || playerControlled == false )
806  {
808  {
809  if ( groundBased )
810  {
811  self addPlayerStat( "destroy_ai_scorestreak_coldblooded", 1 );
812  }
814  {
815  if ( groundBased )
816  {
817  self.pers["challenge_destroyed_ground"]++;
818  }
819  else
820  {
821  self.pers["challenge_destroyed_air"]++;
822  }
823 
824  if ( self.pers["challenge_destroyed_ground"] > 0 && self.pers["challenge_destroyed_air"] > 0 )
825  {
826  self addPlayerStat( "destroy_air_and_ground_blindeye_coldblooded", 1 );
827  self.pers["challenge_destroyed_air"] = 0;
828  self.pers["challenge_destroyed_ground"] = 0;
829  }
830  }
831  }
832  }
833 
834  if ( !isdefined( self.pers["challenge_destroyed_killstreak"] ) )
835  {
836  self.pers["challenge_destroyed_killstreak"] = 0;
837  }
838  self.pers["challenge_destroyed_killstreak"]++;
839 
840  if ( self.pers["challenge_destroyed_killstreak"] >= 5 )
841  {
842  self.pers["challenge_destroyed_killstreak"] = 0;
843  self addWeaponStat( weapon, "destroy_5_killstreak", 1 ); // keeping this just in case we need to award it for old stats
844  self addWeaponStat( weapon, "destroy_5_killstreak_vehicle", 1 ); // the meaning of this has been changes to mean any scorestreak (including turrets)
845  }
846 
847  self addWeaponStat( weapon, "destroy_killstreak", 1 );
848 
849  weaponPickedUp = false;
850  if( isdefined( self.pickedUpWeapons ) && isdefined( self.pickedUpWeapons[weapon] ) )
851  {
852  weaponPickedUp = true;
853  }
854  self AddWeaponStat( weapon, "destroyed", 1, self.class_num, weaponPickedUp, undefined, self.primaryLoadoutGunSmithVariantIndex, self.secondaryLoadoutGunSmithVariantIndex );
855 
856  self thread ‪watchForRapidDestroy( weapon );
857 }
858 
859 
860 function ‪watchForRapidDestroy( weapon )
861 {
862  self endon( "disconnect" );
863  if ( !isdefined( self.challenge_previousDestroyWeapon ) || self.challenge_previousDestroyWeapon != weapon )
864  {
865  self.challenge_previousDestroyWeapon = weapon;
866  self.challenge_previousDestroyCount = 0;
867  }
868  else
869  {
870  self.challenge_previousDestroyCount++;
871  }
872 
873 
874  self ‪waitTillTimeoutOrDeath( 4.0 );
875 
876  if ( self.challenge_previousDestroyCount > 1 )
877  {
878  self addWeaponStat( weapon, "destroy_2_killstreaks_rapidly", 1 );
879  }
880 }
881 
882 function ‪capturedObjective( captureTime, objective )
883 {
884  if ( isdefined( self.smokeGrenadeTime ) && isdefined( self.smokeGrenadePosition ) )
885  {
886  if ( self.smokeGrenadeTime + 14000 > captureTime )
887  {
888  distSq = distanceSquared( self.smokeGrenadePosition, self.origin );
889 
890  if ( distSq < 57600 ) // 20 feet
891  {
892  if ( self ‪util::is_item_purchased( "willy_pete" ) )
893  {
894  self AddPlayerStat( "capture_objective_in_smoke", 1 );
895  }
896  self AddWeaponStat( GetWeapon( "willy_pete" ), "CombatRecordStat", 1 );
897  break;
898  }
899  }
900  }
901 
902  if ( isdefined( level.capturedObjectiveFunction ) )
903  {
904  self [[level.capturedObjectiveFunction]]();
905  }
906 
907  heroAbilityWasActiveRecently = ( isdefined( self.heroAbilityActive ) || ( isdefined( self.heroAbilityDectivateTime ) && self.heroAbilityDectivateTime > gettime() - 3000 ) );
908  if ( heroAbilityWasActiveRecently && isdefined( self.heroAbility ) && self.heroAbility.name == "gadget_camo" )
909  {
910  scoreevents::processscoreevent( "optic_camo_capture_objective", self );
911  }
912 
913  if ( isdefined( objective ) )
914  {
915  if ( self.challenge_objectiveDefensive === objective )
916  {
917  if ( ( ‪VAL( self.challenge_objectiveDefensiveKillcount, 0 ) > 0 ) &&
918  ( ( ‪VAL( self.recentKillCount, 0 ) > 2 ) || ( self.challenge_objectiveDefensiveTripleKillMedalOrBetterEarned === true ) ) )
919  {
920  self AddPlayerStat( "triple_kill_defenders_and_capture", 1 );
921  }
922  self.challenge_objectiveDefensiveKillcount = 0;
923  self.challenge_objectiveDefensive = undefined;
924  self.challenge_objectiveDefensiveTripleKillMedalOrBetterEarned = undefined;
925  }
926  }
927 }
928 
930 {
932  {
933  self AddPlayerStat( "perk_hacker_destroy", 1 );
934  }
935 }
936 
937 function ‪bladeKill()
938 {
939  if ( !isdefined( self.pers["bladeKills"] ) )
940  {
941  self.pers["bladeKills"] = 0;
942  }
943  self.pers["bladeKills"]++;
944  if ( self.pers["bladeKills"] >= 15 )
945  {
946  self.pers["bladeKills"] = 0;
947  self AddPlayerStat( "kill_15_with_blade", 1 );
948  }
949 }
950 
951 function ‪destroyedExplosive( weapon )
952 {
953  self ‪destroyedEquipment( weapon );
954  self AddPlayerStat( "destroy_explosive", 1 );
955 }
956 
957 function ‪assisted()
958 {
959  self AddPlayerStat( "assist", 1 );
960 }
961 
963 {
964  self AddPlayerStat( "assist_score_microwave_turret", score );
965  self AddPlayerStat( "assist_score_killstreak", score );
966  self AddWeaponStat( GetWeapon( "microwave_turret_deploy" ), "assists", 1 );
967  self AddWeaponStat( GetWeapon( "microwave_turret_deploy" ), "assist_score", score );
968 }
969 
970 function ‪earnedCUAVAssistScore( score )
971 {
972  self AddPlayerStat( "assist_score_cuav", score );
973  self AddPlayerStat( "assist_score_killstreak", score );
974  self AddWeaponStat( GetWeapon( "counteruav" ), "assists", 1 );
975  self AddWeaponStat( GetWeapon( "counteruav" ), "assist_score", score );
976 }
977 
978 function ‪earnedUAVAssistScore( score )
979 {
980  self AddPlayerStat( "assist_score_uav", score );
981  self AddPlayerStat( "assist_score_killstreak", score );
982  self AddWeaponStat( GetWeapon( "uav" ), "assists", 1 );
983  self AddWeaponStat( GetWeapon( "uav" ), "assist_score", score );
984 }
985 
987 {
988  self AddPlayerStat( "assist_score_satellite", score );
989  self AddPlayerStat( "assist_score_killstreak", score );
990  self AddWeaponStat( GetWeapon( "satellite" ), "assists", 1 );
991  self AddWeaponStat( GetWeapon( "satellite" ), "assist_score", score );
992 }
993 
994 function ‪earnedEMPAssistScore( score )
995 {
996  self AddPlayerStat( "assist_score_emp", score );
997  self AddPlayerStat( "assist_score_killstreak", score );
998  self AddWeaponStat( GetWeapon( "emp_turret" ), "assists", 1 );
999  self AddWeaponStat( GetWeapon( "emp_turret" ), "assist_score", score );
1000 }
1001 
1002 
1003 
1004 function ‪teamCompletedChallenge( team, challenge )
1005 {
1006  players = GetPlayers();
1007  for ( i = 0; i < players.size; i++ )
1008  {
1009  if (isdefined( players[i].team ) && players[i].team == team )
1010  {
1011  players[i] AddGameTypeStat( challenge, 1 );
1012  }
1013  }
1014 }
1015 
1016 function ‪endedEarly( winner )
1017 {
1018  if ( level.hostForcedEnd )
1019  return true;
1020 
1021  if ( !isdefined( winner ) )
1022  return true;
1023 
1024  if ( level.teambased )
1025  {
1026  if ( winner == "tie" )
1027  return true;
1028  }
1029 
1030  return false;
1031 }
1032 
1033 function ‪getLosersTeamScores( winner )
1034 {
1035  teamScores = 0;
1036 
1037  foreach ( team in level.teams )
1038  {
1039  if ( team == winner )
1040  continue;
1041 
1042  teamScores += game["teamScores"][team];
1043  }
1044 
1045  return teamScores;
1046 }
1047 
1048 function ‪didLoserFailChallenge( winner, challenge )
1049 {
1050  foreach ( team in level.teams )
1051  {
1052  if ( team == winner )
1053  continue;
1054 
1055  if ( game["challenge"][team][challenge] )
1056  return false;
1057  }
1058 
1059  return true;
1060 }
1061 
1062 function ‪challengeGameEnd( data )
1063 {
1064  player = data.player;
1065  winner = data.winner;
1066 
1067  if ( ‪endedEarly( winner ) )
1068  return;
1069 
1070  if ( level.teambased )
1071  {
1072  winnerScore = game["teamScores"][winner];
1073  loserScore = ‪getLosersTeamScores( winner );
1074  }
1075 
1076  switch ( level.gameType )
1077  {
1078  case "tdm":
1079  {
1080  if ( player.team == winner )
1081  {
1082  if ( winnerScore >= loserScore + 20 )
1083  {
1084  player AddGameTypeStat( "CRUSH", 1 );
1085  }
1086  }
1087 
1088  mostKillsLeastDeaths = true;
1089 
1090  for ( index = 0; index < level.placement["all"].size; index++ )
1091  {
1092  if ( level.placement["all"][index].deaths < player.deaths )
1093  {
1094  mostKillsLeastDeaths = false;
1095  }
1096  if ( level.placement["all"][index].kills > player.kills )
1097  {
1098  mostKillsLeastDeaths = false;
1099  }
1100  }
1101 
1102  if ( mostKillsLeastDeaths && player.kills > 0 && level.placement["all"].size > 3 )
1103  {
1104  player AddGameTypeStat( "most_kills_least_deaths", 1 );
1105  }
1106  }
1107  break;
1108  case "dm":
1109  {
1110  if ( player == winner )
1111  {
1112  if ( level.placement["all"].size >= 2 )
1113  {
1114  secondPlace = level.placement["all"][1];
1115  if ( player.kills >= ( secondPlace.kills + 7 ) )
1116  {
1117  player AddGameTypeStat( "CRUSH", 1 );
1118  }
1119  }
1120  }
1121  }
1122  break;
1123  case "ctf":
1124  {
1125  if ( player.team == winner )
1126  {
1127  if ( loserScore == 0 )
1128  {
1129  player AddGameTypeStat( "SHUT_OUT", 1 );
1130  }
1131  }
1132  }
1133  break;
1134  case "dom":
1135  {
1136  if ( player.team == winner )
1137  {
1138  if ( winnerScore >= loserScore + 70 )
1139  {
1140  player AddGameTypeStat( "CRUSH", 1 );
1141  }
1142  }
1143  }
1144  break;
1145  case "hq":
1146  {
1147  if ( player.team == winner && winnerScore > 0 )
1148  {
1149  if ( winnerScore >= loserScore + 70 )
1150  {
1151  player AddGameTypeStat( "CRUSH", 1 );
1152  }
1153  }
1154  }
1155  break;
1156  case "koth":
1157  {
1158  if ( player.team == winner && winnerScore > 0 )
1159  {
1160  if ( winnerScore >= loserScore + 70 )
1161  {
1162  player AddGameTypeStat( "CRUSH", 1 );
1163  }
1164  }
1165  if ( player.team == winner && winnerScore > 0 )
1166  {
1167  if ( winnerScore >= loserScore + 110 )
1168  {
1169  player AddGameTypeStat( "ANNIHILATION", 1 );
1170  }
1171  }
1172  }
1173  break;
1174  case "dem":
1175  {
1176  if ( player.team == game["defenders"] && player.team == winner )
1177  {
1178  if ( loserScore == 0 )
1179  {
1180  player AddGameTypeStat( "SHUT_OUT", 1 );
1181  }
1182  }
1183  }
1184  break;
1185  case "sd":
1186  {
1187  if ( player.team == winner )
1188  {
1189  if ( loserScore <= 1 )
1190  {
1191  player AddGameTypeStat( "CRUSH", 1 );
1192  }
1193  }
1194  }
1195  default:
1196  break;
1197  }
1198 }
1199 
1200 function ‪multiKill( killCount, weapon )
1201 {
1202  if ( killCount >= 3 && isdefined( self.lastKillWhenInjured ) )
1203  {
1204  if ( self.lastKillWhenInjured + 5000 > getTime() )
1205  {
1206  self AddPlayerStat( "multikill_3_near_death", 1 );
1207  }
1208  }
1209 
1210  self AddWeaponStat( weapon, "doublekill", int( killCount / 2 ) );
1211  self AddWeaponStat( weapon, "triplekill", int( killCount / 3 ) );
1212 
1213  if ( weapon.isheroweapon )
1214  {
1215  doubleKill = int( killCount / 2 );
1216  if ( doubleKill )
1217  {
1218  self AddPlayerStat( "MULTIKILL_2_WITH_HEROWEAPON", doubleKill );
1219  }
1220  tripleKill = int( killCount / 3 );
1221  if ( tripleKill )
1222  {
1223  self AddPlayerStat( "MULTIKILL_3_WITH_HEROWEAPON", tripleKill );
1224  }
1225  }
1226 }
1227 
1228 function ‪domAttackerMultiKill( killCount )
1229 {
1230  self AddGameTypeStat( "kill_2_enemies_capturing_your_objective", 1 );
1231 }
1232 
1233 
1234 function ‪totalDomination( team )
1235 {
1236  ‪teamCompletedChallenge( team, "control_3_points_3_minutes" );
1237 }
1238 
1239 function ‪holdFlagEntireMatch( team, label )
1240 {
1241  switch( label )
1242  {
1243  case "_a":
1244  event = "hold_a_entire_match";
1245  break;
1246  case "_b":
1247  event = "hold_b_entire_match";
1248  break;
1249  case "_c":
1250  event = "hold_c_entire_match";
1251  break;
1252  default:
1253  return;
1254  }
1255 
1256  ‪teamCompletedChallenge( team, event );
1257 }
1258 
1260 {
1261  self AddGameTypeStat( "capture_b_first_minute", 1 );
1262 }
1263 
1264 function ‪controlZoneEntirely( team )
1265 {
1266  ‪teamCompletedChallenge( team, "control_zone_entirely" ) ;
1267 }
1268 
1270 {
1271  self AddPlayerStat( "multikill_3_lmg_or_smg_hip_fire", 1 );
1272 }
1273 
1274 function ‪killedZoneAttacker( weapon )
1275 {
1276  if ( weapon.name == "planemortar" || weapon.name == "remote_missile_missile" || weapon.name == "remote_missile_bomblet" )
1277  {
1278  self thread ‪updatezonemultikills();
1279  }
1280 }
1281 
1282 function ‪killedDog()
1283 {
1284  origin = self.origin;
1285  if ( level.teambased )
1286  {
1287  teammates = ‪util::get_team_alive_players_s( self.team );
1288  foreach( player in teammates.a )
1289  {
1290  if ( player == self )
1291  continue;
1292  distSq = distanceSquared( origin, player.origin );
1293 
1294  if ( distSq < 57600 ) // 20 feet
1295  {
1296  self AddPlayerStat( "killed_dog_close_to_teammate", 1 );
1297  break;
1298  }
1299  }
1300  }
1301 }
1302 
1304 {
1305  self endon ( "disconnect" );
1306  level endon ( "game_ended" );
1307 
1308  self notify ( "updateRecentZoneKills" );
1309  self endon ( "updateRecentZoneKills" );
1310  if ( !isdefined (self.recentZoneKillCount) )
1311  self.recentZoneKillCount = 0;
1312  self.recentZoneKillCount++;
1313 
1314  wait ( 4.0 );
1315 
1316  if ( self.recentZoneKillCount > 1 )
1317  {
1318  self AddPlayerStat( "multikill_2_zone_attackers", 1 );
1319  }
1320 
1321  self.recentZoneKillCount = 0;
1322 }
1323 
1325 {
1326  self AddPlayerStat( "multikill_2_with_rcbomb", 1 );
1327 }
1328 
1330 {
1331  self AddPlayerStat( "multikill_3_remote_missile", 1 );
1332 }
1333 
1334 
1336 {
1337  self AddPlayerStat( "multikill_3_with_mgl", 1 );
1338 }
1339 
1340 
1342 {
1343  self AddGameTypeStat( "immediate_capture", 1 );
1344 }
1345 
1346 
1348 {
1349  self AddGameTypeStat( "contest_then_capture", 1 );
1350 }
1351 
1352 
1354 {
1355  self AddGameTypeStat( "both_bombs_detonate_10_seconds", 1 );
1356 }
1357 
1359 {
1360  self.pers["carepackagesCalled"]++;
1361 
1362  if ( self.pers["carepackagesCalled"] >= 3 )
1363  {
1364  self AddPlayerStat( "call_in_3_care_packages", 1 );
1365  self.pers["carepackagesCalled"] = 0;
1366  }
1367 }
1368 
1369 function ‪destroyedHelicopter( attacker, weapon, damageType, playerControlled )
1370 {
1371  if ( !IsPlayer( attacker ) )
1372  return;
1373 
1374  attacker ‪destroyScoreStreak( weapon, playerControlled, false );
1375  if ( damageType == "MOD_RIFLE_BULLET" || damageType =="MOD_PISTOL_BULLET" )
1376  {
1377  attacker AddPlayerStat( "destroyed_helicopter_with_bullet", 1 );
1378  }
1379 }
1380 
1381 
1382 function ‪destroyedQRDrone( damageType, weapon )
1383 {
1384  self ‪destroyScoreStreak( weapon, true, false );
1385 
1386  self AddPlayerStat( "destroy_qrdrone", 1 );
1387 
1388  if ( damageType == "MOD_RIFLE_BULLET" || damageType =="MOD_PISTOL_BULLET" )
1389  {
1390  self AddPlayerStat( "destroyed_qrdrone_with_bullet", 1 );
1391  }
1392 
1394 }
1395 
1396 // chopper hunter challenge renamed aircraft hunter
1398 {
1399  if ( self hasPerk( "specialty_noname" ) )
1400  {
1401  self AddPlayerStat( "destroy_helicopter", 1 );
1402  }
1403 }
1404 
1405 function ‪destroyedAircraft( attacker, weapon, playerControlled )
1406 {
1407  if ( !IsPlayer( attacker ) )
1408  return;
1409 
1410  attacker ‪destroyScoreStreak( weapon, playerControlled, false );
1411 
1412  if ( isdefined( weapon ) )
1413  {
1414  if ( weapon.name == "emp" && attacker ‪util::is_item_purchased( "killstreak_emp" ) ) // killstreak only, not grenade
1415  {
1416  attacker AddPlayerStat( "destroy_aircraft_with_emp", 1 );
1417  }
1418  else if ( weapon.name == "missile_drone_projectile" || weapon.name == "missile_drone" )
1419  {
1420  attacker AddPlayerStat( "destroy_aircraft_with_missile_drone", 1 );
1421  }
1422  else if ( weapon.isBulletWeapon )
1423  {
1424  attacker AddPlayerStat( "shoot_aircraft", 1 );
1425  }
1426  }
1427 
1429  {
1430  attacker AddPlayerStat( "perk_nottargetedbyairsupport_destroy_aircraft", 1 );
1431  }
1432 
1433  attacker AddPlayerStat( "destroy_aircraft", 1 );
1434 
1435  if ( isdefined( playerControlled ) && playerControlled == false )
1436  {
1438  {
1439  attacker AddPlayerStat( "destroy_ai_aircraft_using_blindeye", 1 );
1440  }
1441  }
1442 }
1443 
1445 {
1446  if ( !IsDefined( self.class_num ) )
1447  {
1448  return;
1449  }
1450 
1451  primary = self GetLoadoutItem( self.class_num, "primary" );
1452  if ( primary != 0 )
1453  {
1454  return;
1455  }
1456  secondary = self GetLoadoutItem( self.class_num, "secondary" );
1457  if ( secondary != 0 )
1458  {
1459  return;
1460  }
1461  primarygrenade = self GetLoadoutItem( self.class_num, "primarygrenade" );
1462  if ( primarygrenade != 0 )
1463  {
1464  return;
1465  }
1466  specialgrenade = self GetLoadoutItem( self.class_num, "specialgrenade" );
1467  if ( specialgrenade != 0 )
1468  {
1469  return;
1470  }
1471 
1472  for ( numSpecialties = 0; numSpecialties < level.maxSpecialties; numSpecialties++ )
1473  {
1474  perk = self GetLoadoutItem( self.class_num, "specialty" + ( numSpecialties + 1 ) );
1475  if ( perk != 0 )
1476  {
1477  return;
1478  }
1479  }
1480 
1481  self AddPlayerStat( "killstreak_10_no_weapons_perks", 1 );
1482 }
1483 
1485 {
1486  self endon("disconnect");
1487  self endon("death");
1488  self notify("scavengedGrenade");
1489  self endon("scavengedGrenade");
1490 
1491 
1492  self notify( "scavenged_primary_grenade" );
1493  for(;;)
1494  {
1495  self waittill( "lethalGrenadeKill" );
1496  self AddPlayerStat( "kill_with_resupplied_lethal_grenade", 1 );
1497  }
1498 }
1499 
1500 function ‪stunnedTankWithEMPGrenade( attacker )
1501 {
1502  attacker AddPlayerStat( "stun_aitank_wIth_emp_grenade", 1 );
1503 }
1504 
1505 
1506 function ‪playerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, sHitLoc, attackerStance, bledOut )
1507 {
1508 
1509 /# print(level.gameType); #/
1510  self.anglesOnDeath = self getPlayerAngles();
1511  if ( isdefined( attacker ) )
1512  attacker.anglesOnKill = attacker getPlayerAngles();
1513  if ( !isdefined( weapon ) )
1514  weapon = level.weaponNone;
1515 
1516  self endon("disconnect");
1517 
1518  data = spawnstruct();
1519 
1520  data.victim = self;
1521  data.victimOrigin = self.origin;
1522  data.victimStance = self getStance();
1523  data.eInflictor = eInflictor;
1524  data.attacker = attacker;
1525  data.attackerStance = attackerStance;
1526  data.iDamage = iDamage;
1527  data.sMeansOfDeath = sMeansOfDeath;
1528  data.weapon = weapon;
1529  data.sHitLoc = sHitLoc;
1530  data.time = gettime();
1531  data.bledOut = false;
1532  if ( isdefined( bledOut ) )
1533  {
1534  data.bledOut = bledOut;
1535  }
1536 
1537  if ( isdefined( eInflictor ) && isdefined( eInflictor.lastWeaponBeforeToss ) )
1538  {
1539  data.lastWeaponBeforeToss = eInflictor.lastWeaponBeforeToss;
1540  }
1541  if ( isdefined( eInflictor ) && isdefined( eInflictor.ownerWeaponAtLaunch ) )
1542  {
1543  data.ownerWeaponAtLaunch = eInflictor.ownerWeaponAtLaunch;
1544  }
1545 
1546 
1547  wasLockingOn = 0;
1548  washacked = false;
1549  if ( isdefined( eInflictor ) )
1550  {
1551  if ( isdefined ( eInflictor.locking_on ) )
1552  {
1553  wasLockingOn |= eInflictor.locking_on;
1554  }
1555 
1556  if ( isdefined ( eInflictor.locked_on ) )
1557  {
1558  wasLockingOn |= eInflictor.locked_on;
1559  }
1560 
1561  wasHacked = einflictor ‪util::isHacked();
1562  }
1563 
1564  wasLockingOn &= ( 1 << data.victim.entnum );
1565  if ( wasLockingOn != 0 )
1566  {
1567  data.wasLockingOn = true;
1568  }
1569  else
1570  {
1571  data.wasLockingOn = false;
1572  }
1573  data.wasHacked = washacked;
1574  data.wasPlanting = data.victim.isplanting;
1575  data.wasUnderwater = data.victim IsPlayerUnderwater();
1576  if ( !isdefined( data.wasPlanting ) )
1577  {
1578  data.wasPlanting = false;
1579  }
1580  data.wasDefusing = data.victim.isdefusing;
1581  if ( !isdefined( data.wasDefusing ) )
1582  {
1583  data.wasDefusing = false;
1584  }
1585  data.victimWeapon = data.victim.currentWeapon;
1586  data.victimOnGround = data.victim isOnGround();
1587  data.victimWasWallRunning = data.victim isWallRunning();
1588  data.victimLastStunnedBy = data.victim.lastStunnedBy;
1589  data.victimWasDoubleJumping = data.victim IsDoubleJumping();
1590  data.victimCombatEfficiencyLastOnTime = data.victim.combatEfficiencyLastOnTime;
1591  data.victimSpeedburstLastOnTime = data.victim.speedburstLastOnTime;
1592  data.victimCombatEfficieny = data.victim ‪ability_util::gadget_is_active( ‪GADGET_TYPE_COMBAT_EFFICIENCY );
1593  data.victimflashbackTime = data.victim.flashbackTime;
1594  data.victimheroAbilityActive = ‪ability_player::gadget_CheckHeroAbilityKill( data.victim );
1595  data.victimElectrifiedBy = data.victim.electrifiedBy;
1596  data.victimHeroAbility = data.victim.heroAbility;
1597  data.victimWasInSlamState = data.victim IsSlamming();
1598  data.victimWasLungingWithArmBlades = data.victim IsGadgetMeleeCharging();
1599  data.victimWasHeatWaveStunned = data.victim ‪isHeatWaveStunned();
1600  data.victimPowerArmorLastTookDamageTime = data.victim.power_armor_last_took_damage_time;
1601  data.victimHeroWeaponKillsThisActivation = data.victim.heroWeaponKillsThisActivation;
1602  data.victimGadgetPower = data.victim GadgetPowerGet( 0 );
1603  data.victimGadgetWasActiveLastDamage = data.victim.gadget_was_active_last_damage;
1604  data.victimIsThiefOrRoulette = ( data.victim.isThief === true || data.victim.isRoulette === true );
1605  data.victimHeroAbilityName = data.victim.heroAbilityName;
1606 
1607  if ( !isdefined( data.victimflashbackTime ) )
1608  {
1609  data.victimflashbackTime = 0;
1610  }
1611  if ( !isdefined( data.victimCombatEfficiencyLastOnTime ) )
1612  {
1613  data.victimCombatEfficiencyLastOnTime = 0;
1614  }
1615  if ( !isdefined( data.victimSpeedburstLastOnTime ) )
1616  {
1617  data.victimSpeedburstLastOnTime = 0;
1618  }
1619  data.victimVisionPulseActivateTime = data.victim.visionPulseActivateTime;
1620  if ( !isdefined( data.victimVisionPulseActivateTime ) )
1621  {
1622  data.victimVisionPulseActivateTime = 0;
1623  }
1624  data.victimVisionPulseArray = ‪util::array_copy_if_array( data.victim.visionPulseArray );
1625  data.victimVisionPulseOrigin = data.victim.visionPulseOrigin;
1626  data.victimVisionPulseOriginArray = ‪util::array_copy_if_array( data.victim.visionPulseOriginArray );
1627  data.victimAttackersThisSpawn = ‪util::array_copy_if_array( data.victim.attackersThisSpawn );
1628 
1629  data.victim_doublejump_begin = data.victim.challenge_doublejump_begin;
1630  data.victim_doublejump_end = data.victim.challenge_doublejump_end;
1631  data.victim_jump_begin = data.victim.challenge_jump_begin;
1632  data.victim_jump_end = data.victim.challenge_jump_end;
1633  data.victim_swimming_begin = data.victim.challenge_swimming_begin;
1634  data.victim_swimming_end = data.victim.challenge_swimming_end;
1635  data.victim_slide_begin = data.victim.challenge_slide_begin;
1636  data.victim_slide_end = data.victim.challenge_slide_end;
1637  data.victim_wallrun_begin = data.victim.challenge_wallrun_begin;
1638  data.victim_wallrun_end = data.victim.challenge_wallrun_end;
1639  data.victim_was_drowning = data.victim ‪drown::is_player_drowning();
1640 
1641  if ( isdefined( data.victim.activeProximityGrenades ) )
1642  {
1643  data.victimActiveProximityGrenades = [];
1644 
1645  ArrayRemoveValue( data.victim.activeProximityGrenades, undefined );
1646 
1647  foreach( proximityGrenade in data.victim.activeProximityGrenades )
1648  {
1649  proximityGrenadeInfo = SpawnStruct();
1650  proximityGrenadeInfo.origin = proximityGrenade.origin;
1651  data.victimActiveProximityGrenades[ data.victimActiveProximityGrenades.size ] = proximityGrenadeInfo;
1652  }
1653  }
1654 
1655  if ( isdefined( data.victim.activeBouncingBetties ) )
1656  {
1657  data.victimActiveBouncingBetties = [];
1658 
1659  ArrayRemoveValue( data.victim.activeBouncingBetties, undefined );
1660 
1661  foreach( bouncingBetty in data.victim.activeBouncingBetties )
1662  {
1663  bouncingBettyInfo = SpawnStruct();
1664  bouncingBettyInfo.origin = bouncingBetty.origin;
1665  data.victimActiveBouncingBetties[ data.victimActiveBouncingBetties.size ] = bouncingBettyInfo;
1666  }
1667  }
1668 
1669  if ( isPlayer( attacker ) )
1670  {
1671  data.attackerOrigin = data.attacker.origin;
1672  data.attackerOnGround = data.attacker isOnGround();
1673  data.attackerWallRunning = data.attacker isWallRunning();
1674  data.attackerDoubleJumping = data.attacker IsDoubleJumping();
1675  data.attackerTraversing = data.attacker IsTraversing();
1676  data.attackerSliding = data.attacker IsSliding();
1677  data.attackerSpeedburst = data.attacker ‪ability_util::gadget_is_active( ‪GADGET_TYPE_SPEED_BURST );
1678  data.attackerflashbackTime = data.attacker.flashbackTime;
1679  data.attackerHeroAbilityActive = ‪ability_player::gadget_CheckHeroAbilityKill( data.attacker );
1680  data.attackerHeroAbility = data.attacker.heroAbility;
1681  if ( !isdefined( data.attackerflashbackTime ) )
1682  {
1683  data.attackerflashbackTime = 0;
1684  }
1685  data.attackerVisionPulseActivateTime = attacker.visionPulseActivateTime;
1686  if ( !isdefined( data.attackerVisionPulseActivateTime ) )
1687  {
1688  data.attackerVisionPulseActivateTime = 0;
1689  }
1690  data.attackerVisionPulseArray = ‪util::array_copy_if_array( attacker.visionPulseArray );
1691  data.attackerVisionPulseOrigin = attacker.visionPulseOrigin;
1692  if ( !isdefined( data.attackerStance ) )
1693  {
1694  data.attackerStance = data.attacker getStance();
1695  }
1696  data.attackerVisionPulseOriginArray = ‪util::array_copy_if_array( attacker.visionPulseOriginArray );
1697 
1698  data.attackerWasFlashed = data.attacker ‪isFlashbanged();
1699  data.attackerLastFlashedBy = data.attacker.lastFlashedBy;
1700  data.attackerLastStunnedBy = data.attacker.lastStunnedBy;
1701  data.attackerLastStunnedTime = data.attacker.lastStunnedTime;
1702  data.attackerWasConcussed = ( isdefined( data.attacker.concussionEndTime ) && data.attacker.concussionEndTime > gettime() );
1703  data.attackerWasHeatWaveStunned = data.attacker ‪isHeatWaveStunned();
1704  data.attackerWasUnderwater = data.attacker IsPlayerUnderwater();
1705  data.attackerLastFastReloadTime = data.attacker.lastFastReloadTime;
1706  data.attackerWasSliding = data.attacker IsSliding();
1707  data.attackerWasSprinting = data.attacker issprinting();
1708  data.attackerIsThief = ( attacker.isThief === true );
1709  data.attackerIsRoulette = ( attacker.isRoulette === true );
1710 
1711 
1712  data.attacker_doublejump_begin = data.attacker.challenge_doublejump_begin;
1713  data.attacker_doublejump_end = data.attacker.challenge_doublejump_end;
1714  data.attacker_jump_begin = data.attacker.challenge_jump_begin;
1715  data.attacker_jump_end = data.attacker.challenge_jump_end;
1716  data.attacker_swimming_begin = data.attacker.challenge_swimming_begin;
1717  data.attacker_swimming_end = data.attacker.challenge_swimming_end;
1718  data.attacker_slide_begin = data.attacker.challenge_slide_begin;
1719  data.attacker_slide_end = data.attacker.challenge_slide_end;
1720  data.attacker_wallrun_begin = data.attacker.challenge_wallrun_begin;
1721  data.attacker_wallrun_end = data.attacker.challenge_wallrun_end;
1722  data.attacker_was_drowning = data.attacker ‪drown::is_player_drowning();
1723 
1724  data.attacker_sprint_begin = data.attacker.challenge_sprint_begin;
1725  data.attacker_sprint_end = data.attacker.challenge_sprint_end;
1726 
1727  data.attacker_wallRanTwoOppositeWallsNoGround = data.attacker.wallRanTwoOppositeWallsNoGround;
1728 
1729  if ( ( level.allow_vehicle_challenge_check === true ) && attacker IsInVehicle() )
1730  {
1731  vehicle = attacker GetVehicleOccupied();
1732 
1733  if ( isdefined( vehicle ) )
1734  {
1735  data.attackerInVehicleArchetype = vehicle.archetype;
1736  }
1737  }
1738  }
1739  else
1740  {
1741  data.attackerOnGround = false;
1742  data.attackerWallRunning = false;
1743  data.attackerDoubleJumping = false;
1744  data.attackerTraversing = false;
1745  data.attackerSliding = false;
1746  data.attackerSpeedburst = false;
1747  data.attackerflashbackTime = 0;
1748  data.attackerVisionPulseActivateTime = 0;
1749  data.attackerWasFlashed = false;
1750  data.attackerWasConcussed = false;
1751  data.attackerHeroAbilityActive = false;
1752  data.attackerWasHeatWaveStunned = false;
1753  data.attackerStance = "stand";
1754  data.attackerWasUnderwater = false;
1755  data.attackerWasSprinting = false;
1756  data.attackerIsThief = false;
1757  data.attackerIsRoulette = false;
1758  }
1759 
1760  if ( isdefined( eInflictor ) )
1761  {
1762  if ( isdefined( eInflictor.IsCooked ) )
1763  {
1764  data.inflictorIsCooked = eInflictor.IsCooked;
1765  }
1766  else
1767  {
1768  data.inflictorIsCooked = false;
1769  }
1770 
1771  if ( isdefined( eInflictor.Challenge_hatchetTossCount ) )
1772  {
1773  data.inflictorChallenge_hatchetTossCount = eInflictor.Challenge_hatchetTossCount;
1774  }
1775  else
1776  {
1777  data.inflictorChallenge_hatchetTossCount = 0;
1778  }
1779  if ( isdefined( eInflictor.OwnerWasSprinting ) )
1780  {
1781  data.inflictorOwnerWasSprinting = eInflictor.OwnerWasSprinting;
1782  }
1783  else
1784  {
1785  data.inflictorOwnerWasSprinting = false;
1786  }
1787  if ( isdefined( eInflictor.PlayerHasEngineerPerk ) )
1788  {
1789  data.inflictorPlayerHasEngineerPerk = eInflictor.PlayerHasEngineerPerk;
1790  }
1791  else
1792  {
1793  data.inflictorPlayerHasEngineerPerk = false;
1794  }
1795  }
1796  else
1797  {
1798  data.inflictorIsCooked = false;
1799  data.inflictorChallenge_hatchetTossCount = 0;
1800  data.inflictorOwnerWasSprinting = false;
1801  data.inflictorPlayerHasEngineerPerk = false;
1802  }
1803 
1804 
1806 
1807  data.attacker notify( "playerKilledChallengesProcessed" );
1808 }
1809 
1811 {
1812  if ( !isdefined( level.scoreEventCallbacks ) )
1813  return;
1814 
1815  if ( !isdefined( level.scoreEventCallbacks[‪callback] ) )
1816  return;
1817 
1818  if ( isdefined( data ) )
1819  {
1820  for ( i = 0; i < level.scoreEventCallbacks[‪callback].size; i++ )
1821  thread [[level.scoreEventCallbacks[‪callback][i]]]( data );
1822  }
1823  else
1824  {
1825  for ( i = 0; i < level.scoreEventCallbacks[‪callback].size; i++ )
1826  thread [[level.scoreEventCallbacks[‪callback][i]]]();
1827  }
1828 }
1829 
1831 {
1832  if ( isdefined( data.attacker ) )
1833  data.attacker endon("disconnect");
1834 
1835  wait .05;
1837 
1838  level thread ‪doChallengeCallback( "playerKilled", data );
1839  level thread ‪doScoreEventCallback( "playerKilled", data );
1840 }
1841 
1842 function ‪weaponIsKnife( weapon )
1843 {
1844  if ( weapon == level.weaponBaseMelee || weapon == level.weaponBaseMeleeHeld || weapon == level.weaponBallisticKnife )
1845  {
1846  return true;
1847  }
1848 
1849  return false;
1850 }
1851 
1852 function ‪eventReceived( eventName )
1853 {
1854  self endon( "disconnect" );
1855 
1857 
1858  switch ( level.gameType )
1859  {
1860  case "tdm":
1861  {
1862  if ( eventName == "killstreak_10" )
1863  {
1864  self AddGameTypeStat( "killstreak_10", 1 );
1865  }
1866  else if ( eventName == "killstreak_15" )
1867  {
1868  self AddGameTypeStat( "killstreak_15", 1 );
1869  }
1870  else if ( eventName == "killstreak_20" )
1871  {
1872  self AddGameTypeStat( "killstreak_20", 1 );
1873  }
1874  else if ( eventName == "multikill_3" )
1875  {
1876  self AddGameTypeStat( "multikill_3", 1 );
1877  }
1878  else if ( eventName == "kill_enemy_who_killed_teammate" )
1879  {
1880  self AddGameTypeStat( "kill_enemy_who_killed_teammate", 1 );
1881  }
1882  else if ( eventName == "kill_enemy_injuring_teammate" )
1883  {
1884  self AddGameTypeStat( "kill_enemy_injuring_teammate", 1 );
1885  }
1886  }
1887  break;
1888  case "dm":
1889  {
1890  if ( eventName == "killstreak_10" )
1891  {
1892  self AddGameTypeStat( "killstreak_10", 1 );
1893  }
1894  else if ( eventName == "killstreak_15" )
1895  {
1896  self AddGameTypeStat( "killstreak_15", 1 );
1897  }
1898  else if ( eventName == "killstreak_20" )
1899  {
1900  self AddGameTypeStat( "killstreak_20", 1 );
1901  }
1902  else if ( eventName == "killstreak_30" )
1903  {
1904  self AddGameTypeStat( "killstreak_30", 1 );
1905  }
1906  }
1907  break;
1908  case "sd":
1909  {
1910  if ( eventName == "defused_bomb_last_man_alive" )
1911  {
1912  self AddGameTypeStat( "defused_bomb_last_man_alive", 1 );
1913  }
1914  else if ( eventName == "elimination_and_last_player_alive" )
1915  {
1916  self AddGameTypeStat( "elimination_and_last_player_alive", 1 );
1917  }
1918  else if ( eventName == "killed_bomb_planter" )
1919  {
1920  self AddGameTypeStat( "killed_bomb_planter", 1 );
1921  }
1922  else if ( eventName == "killed_bomb_defuser" )
1923  {
1924  self AddGameTypeStat( "killed_bomb_defuser", 1 );
1925  }
1926  }
1927  break;
1928  case "ctf":
1929  {
1930  if ( eventName == "kill_flag_carrier" )
1931  {
1932  self AddGameTypeStat( "kill_flag_carrier", 1 );
1933  }
1934  else if ( eventName == "defend_flag_carrier" )
1935  {
1936  self AddGameTypeStat( "defend_flag_carrier", 1 );
1937  }
1938  }
1939  break;
1940  case "dem":
1941  {
1942  if ( eventName == "killed_bomb_planter" )
1943  {
1944  self AddGameTypeStat( "killed_bomb_planter", 1 );
1945  }
1946  else if ( eventName == "killed_bomb_defuser" )
1947  {
1948  self AddGameTypeStat( "killed_bomb_defuser", 1 );
1949  }
1950  }
1951  break;
1952  default:
1953  break;
1954  }
1955 }
1956 
1958 {
1959  self endon("disconnect");
1960  self endon("killPlayerSprintMonitor");
1961  self endon ( "death" );
1962 
1963  self.lastSprintTime = undefined;
1964 
1965  while(1)
1966  {
1967  self waittill("sprint_begin");
1968 
1969  self waittill ("sprint_end");
1970 
1971  self.lastSprintTime = GetTime();
1972  }
1973 }
1974 
1975 
1977 {
1978  return isdefined( self.flashEndTime ) && gettime() < self.flashEndTime;
1979 }
1980 
1982 {
1983  return isdefined( self._heat_wave_stuned_end ) && gettime() < self._heat_wave_stuned_end;
1984 }
1985 
1986 
1987 function ‪trophy_defense( origin, radius )
1988 {
1989  if ( isdefined( level.challenge_scorestreaksenabled ) && level.challenge_scorestreaksenabled == true )
1990  {
1991  entities = GetDamageableEntArray( origin, radius );
1992  foreach( entity in entities )
1993  {
1994  if ( isdefined( entity.challenge_isScoreStreak ) )
1995  {
1996  self AddPlayerStat( "protect_streak_with_trophy", 1 );
1997  break;
1998  }
1999  }
2000  }
2001 }
2002 
2004 {
2005  self endon( "death" );
2006  wait( ‪timeout );
2007 }
2008 
‪has_purchased_perk_equipped
‪function has_purchased_perk_equipped(ref)
Definition: util_shared.gsc:4069
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪has_hacker_perk_purchased_and_equipped
‪function has_hacker_perk_purchased_and_equipped()
Definition: util_shared.gsc:4110
‪timeout
‪function timeout(n_time, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:762
‪killedLastContester
‪function killedLastContester()
Definition: challenges_shared.gsc:1347
‪callback
‪function callback(event, localclientnum, params)
Definition: callbacks_shared.csc:13
‪flakjacketProtected
‪function flakjacketProtected(weapon, attacker)
Definition: challenges_shared.gsc:441
‪destroyRCBomb
‪function destroyRCBomb(weapon)
Definition: challenges_shared.gsc:755
‪multi_RemoteMissile_Kill
‪function multi_RemoteMissile_Kill()
Definition: challenges_shared.gsc:1329
‪destroyedHelicopter
‪function destroyedHelicopter(attacker, weapon, damageType, playerControlled)
Definition: challenges_shared.gsc:1369
‪array_copy_if_array
‪function array_copy_if_array(any_var)
Definition: util_shared.gsc:4058
‪getFinalKill
‪function getFinalKill(player)
Definition: challenges_shared.gsc:746
‪destroyedEquipment
‪function destroyedEquipment(weapon)
Definition: challenges_shared.gsc:43
‪isFlashbanged
‪function isFlashbanged()
Definition: challenges_shared.gsc:1976
‪disarmedHackedCarepackage
‪function disarmedHackedCarepackage()
Definition: challenges_shared.gsc:584
‪scavengedGrenade
‪function scavengedGrenade()
Definition: challenges_shared.gsc:1484
‪destroyedTacticalInsert
‪function destroyedTacticalInsert()
Definition: challenges_shared.gsc:72
‪initChallengeData
‪function initChallengeData()
Definition: challenges_shared.gsc:254
‪longDistanceKill
‪function longDistanceKill()
Definition: challenges_shared.gsc:623
‪blockedSatellite
‪function blockedSatellite()
Definition: challenges_shared.gsc:618
‪endedEarly
‪function endedEarly(winner)
Definition: challenges_shared.gsc:1016
‪destroyedExplosive
‪function destroyedExplosive(weapon)
Definition: challenges_shared.gsc:951
‪roundEnd
‪function roundEnd(winner)
Definition: challenges_shared.gsc:672
‪earnedUAVAssistScore
‪function earnedUAVAssistScore(score)
Definition: challenges_shared.gsc:978
‪multiKill
‪function multiKill(killCount, weapon)
Definition: challenges_shared.gsc:1200
‪has_cold_blooded_perk_purchased_and_equipped
‪function has_cold_blooded_perk_purchased_and_equipped()
Definition: util_shared.gsc:4115
‪destroyScoreStreak
‪function destroyScoreStreak(weapon, playerControlled, groundBased, countAsKillstreakVehicle=true)
Definition: challenges_shared.gsc:784
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪doChallengeCallback
‪function doChallengeCallback(callback, data)
Definition: challenges_shared.gsc:173
‪reloadThenKillTimeOut
‪function reloadThenKillTimeOut(time)
Definition: challenges_shared.gsc:245
‪GADGET_TYPE_SPEED_BURST
‪#define GADGET_TYPE_SPEED_BURST
Definition: _ability_util.gsh:17
‪addFlySwatterStat
‪function addFlySwatterStat(weapon, aircraft)
Definition: challenges_shared.gsc:86
‪destroyedPlayerControlledAircraft
‪function destroyedPlayerControlledAircraft()
Definition: challenges_shared.gsc:1397
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪capturedObjective
‪function capturedObjective(captureTime, objective)
Definition: challenges_shared.gsc:882
‪destroyed_car
‪function destroyed_car()
Definition: challenges_shared.gsc:589
‪isHighestScoringPlayer
‪function isHighestScoringPlayer(player)
Definition: challenges_shared.gsc:497
‪capturedBFirstMinute
‪function capturedBFirstMinute()
Definition: challenges_shared.gsc:1259
‪pickedUpBallisticKnife
‪function pickedUpBallisticKnife()
Definition: challenges_shared.gsc:20
‪registerChallengesCallback
‪function registerChallengesCallback(callback, func)
Definition: challenges_shared.gsc:166
‪killedZoneAttacker
‪function killedZoneAttacker(weapon)
Definition: challenges_shared.gsc:1274
‪killWhileDamagingWithHPM
‪function killWhileDamagingWithHPM()
Definition: challenges_shared.gsc:608
‪calledInCarePackage
‪function calledInCarePackage()
Definition: challenges_shared.gsc:1358
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪has_blind_eye_perk_purchased_and_equipped
‪function has_blind_eye_perk_purchased_and_equipped()
Definition: util_shared.gsc:4093
‪canProcessChallenges
‪function canProcessChallenges()
Definition: challenges_shared.gsc:133
‪IDFLAGS_PENETRATION
‪#define IDFLAGS_PENETRATION
Definition: shared.gsh:414
‪GADGET_TYPE_COMBAT_EFFICIENCY
‪#define GADGET_TYPE_COMBAT_EFFICIENCY
Definition: _ability_util.gsh:19
‪holdFlagEntireMatch
‪function holdFlagEntireMatch(team, label)
Definition: challenges_shared.gsc:1239
‪is_item_purchased
‪function is_item_purchased(ref)
Definition: util_shared.gsc:4063
‪immediateCapture
‪function immediateCapture()
Definition: challenges_shared.gsc:1341
‪waitTillTimeoutOrDeath
‪function waitTillTimeoutOrDeath(timeout)
Definition: challenges_shared.gsc:2003
‪initTeamChallenges
‪function initTeamChallenges(team)
Definition: challenges_shared.gsc:149
‪killstreakTen
‪function killstreakTen()
Definition: challenges_shared.gsc:1444
‪stunnedTankWithEMPGrenade
‪function stunnedTankWithEMPGrenade(attacker)
Definition: challenges_shared.gsc:1500
‪destroyedAircraft
‪function destroyedAircraft(attacker, weapon, playerControlled)
Definition: challenges_shared.gsc:1405
‪watchForMantle
‪function watchForMantle()
Definition: challenges_shared.gsc:570
‪genericBulletKill
‪function genericBulletKill(data, victim, weapon)
Definition: challenges_shared.gsc:470
‪isStunned
‪function isStunned()
Definition: util_shared.gsc:813
‪totalDomination
‪function totalDomination(team)
Definition: challenges_shared.gsc:1234
‪isDamageFromPlayerControlledSentry
‪function isDamageFromPlayerControlledSentry(eAttacker, eInflictor, weapon)
Definition: challenges_shared.gsc:289
‪trophy_defense
‪function trophy_defense(origin, radius)
Definition: challenges_shared.gsc:1987
‪teamCompletedChallenge
‪function teamCompletedChallenge(team, challenge)
Definition: challenges_shared.gsc:1004
‪challengeGameEnd
‪function challengeGameEnd(data)
Definition: challenges_shared.gsc:1062
‪is_player_drowning
‪function is_player_drowning()
Definition: drown.gsc:136
‪eventReceived
‪function eventReceived(eventName)
Definition: challenges_shared.gsc:1852
‪playerKilled
‪function playerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, weapon, sHitLoc, attackerStance, bledOut)
Definition: challenges_shared.gsc:1506
‪monitorReloads
‪function monitorReloads()
Definition: challenges_shared.gsc:200
‪capturedCrate
‪function capturedCrate(owner)
Definition: challenges_shared.gsc:767
‪challengeRoundEnd
‪function challengeRoundEnd(data)
Definition: challenges_shared.gsc:634
‪domAttackerMultiKill
‪function domAttackerMultiKill(killCount)
Definition: challenges_shared.gsc:1228
‪perkKills
‪function perkKills(victim, isStunned, time)
Definition: challenges_shared.gsc:307
‪destroyedQRDrone
‪function destroyedQRDrone(damageType, weapon)
Definition: challenges_shared.gsc:1382
‪gameEnd
‪function gameEnd(winner)
Definition: challenges_shared.gsc:704
‪getLosersTeamScores
‪function getLosersTeamScores(winner)
Definition: challenges_shared.gsc:1033
‪watchForRapidDestroy
‪function watchForRapidDestroy(weapon)
Definition: challenges_shared.gsc:860
‪init_shared
‪function init_shared()
Definition: challenges_shared.gsc:16
‪gadget_CheckHeroAbilityKill
‪function gadget_CheckHeroAbilityKill(attacker)
Definition: _ability_player.gsc:529
‪get_team_alive_players_s
‪function get_team_alive_players_s(teamName)
Definition: util_shared.gsc:2822
‪isDamageFromPlayerControlledAITank
‪function isDamageFromPlayerControlledAITank(eAttacker, eInflictor, weapon)
Definition: challenges_shared.gsc:264
‪earnedKillstreak
‪function earnedKillstreak()
Definition: challenges_shared.gsc:452
‪multi_RCBomb_Kill
‪function multi_RCBomb_Kill()
Definition: challenges_shared.gsc:1324
‪hackedOrDestroyedEquipment
‪function hackedOrDestroyedEquipment()
Definition: challenges_shared.gsc:929
‪updatezonemultikills
‪function updatezonemultikills()
Definition: challenges_shared.gsc:1303
‪controlZoneEntirely
‪function controlZoneEntirely(team)
Definition: challenges_shared.gsc:1264
‪killedDog
‪function killedDog()
Definition: challenges_shared.gsc:1282
‪bladeKill
‪function bladeKill()
Definition: challenges_shared.gsc:937
‪killedNemesis
‪function killedNemesis()
Definition: challenges_shared.gsc:598
‪trackAssists
‪function trackAssists(attacker, damage, isFlare)
Definition: challenges_shared.gsc:26
‪multi_MGL_Kill
‪function multi_MGL_Kill()
Definition: challenges_shared.gsc:1335
‪earnedSatelliteAssistScore
‪function earnedSatelliteAssistScore(score)
Definition: challenges_shared.gsc:986
‪bothBombsDetonateWithinTime
‪function bothBombsDetonateWithinTime()
Definition: challenges_shared.gsc:1353
‪earnedMicrowaveAssistScore
‪function earnedMicrowaveAssistScore(score)
Definition: challenges_shared.gsc:962
‪earnedEMPAssistScore
‪function earnedEMPAssistScore(score)
Definition: challenges_shared.gsc:994
‪spawnWatcher
‪function spawnWatcher()
Definition: challenges_shared.gsc:531
‪weaponIsKnife
‪function weaponIsKnife(weapon)
Definition: challenges_shared.gsc:1842
‪waitAndProcessPlayerKilledCallback
‪function waitAndProcessPlayerKilledCallback(data)
Definition: challenges_shared.gsc:1830
‪gadget_is_active
‪function gadget_is_active(gadgetType)
Definition: _ability_util.gsc:151
‪reloadThenKill
‪function reloadThenKill(reloadWeapon)
Definition: challenges_shared.gsc:224
‪assisted
‪function assisted()
Definition: challenges_shared.gsc:957
‪destroyNonAirScoreStreak_PostStatsLock
‪function destroyNonAirScoreStreak_PostStatsLock(weapon)
Definition: challenges_shared.gsc:126
‪longDistanceHatchetKill
‪function longDistanceHatchetKill()
Definition: challenges_shared.gsc:613
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪WaitTillSlowProcessAllowed
‪function WaitTillSlowProcessAllowed()
Definition: util_shared.gsc:2536
‪on_player_connect
‪function on_player_connect()
Definition: challenges_shared.gsc:193
‪earnedCUAVAssistScore
‪function earnedCUAVAssistScore(score)
Definition: challenges_shared.gsc:970
‪doScoreEventCallback
‪function doScoreEventCallback(callback, data)
Definition: challenges_shared.gsc:1810
‪didLoserFailChallenge
‪function didLoserFailChallenge(winner, challenge)
Definition: challenges_shared.gsc:1048
‪multi_LMG_SMG_Kill
‪function multi_LMG_SMG_Kill()
Definition: challenges_shared.gsc:1269
‪isHeatWaveStunned
‪function isHeatWaveStunned()
Definition: challenges_shared.gsc:1981
‪monitor_player_sprint
‪function monitor_player_sprint()
Definition: challenges_shared.gsc:1957
‪watchForDTP
‪function watchForDTP()
Definition: challenges_shared.gsc:555
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265