1 #using scripts\codescripts\struct;
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;
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\abilities\_ability_util.gsh;
14 #namespace challenges;
22 self.retreivedBlades++;
28 if ( !isdefined(
self.flareAttackerDamage ) )
30 self.flareAttackerDamage = [];
33 if ( isdefined ( isFlare ) && isFlare ==
true )
35 self.flareAttackerDamage[attacker.clientid] =
true;
39 self.flareAttackerDamage[attacker.clientid] =
false;
45 if ( IsDefined( weapon ) && weapon.isEmp )
49 self AddPlayerStat(
"destroy_equipment_with_emp_grenade", 1 );
51 self AddWeaponStat( weapon,
"combatRecordStat", 1 );
54 self AddPlayerStat(
"destroy_equipment_with_emp_engineer", 1 );
55 self AddPlayerStat(
"destroy_equipment_engineer", 1 );
60 self AddPlayerStat(
"destroy_equipment_engineer", 1 );
62 self AddPlayerStat(
"destroy_equipment", 1 );
64 if ( IsDefined( weapon ) && weapon.isBulletWeapon )
66 self AddPlayerStat(
"destroy_equipment_with_bullet", 1 );
74 if ( !isdefined(
self.pers[
"tacticalInsertsDestroyed"] ) )
76 self.pers[
"tacticalInsertsDestroyed"] = 0;
78 self.pers[
"tacticalInsertsDestroyed"]++;
79 if (
self.pers[
"tacticalInsertsDestroyed"] >= 5 )
81 self.pers[
"tacticalInsertsDestroyed"] = 0;
82 self AddPlayerStat(
"destroy_5_tactical_inserts", 1 );
88 if ( !isdefined(
self.pers[
"flyswattercount" ] ) )
90 self.pers[
"flyswattercount" ] = 0;
93 self AddWeaponStat( weapon,
"destroyed_aircraft", 1 );
95 self.pers[
"flyswattercount" ]++;
97 if (
self.pers[
"flyswattercount" ] == 5 )
99 self AddWeaponStat( weapon,
"destroyed_5_aircraft", 1 );
102 if ( isdefined( aircraft ) && isdefined( aircraft.birthTime ) )
104 if ( ( GetTime() - aircraft.birthTime ) < 20000 )
106 self AddWeaponStat( weapon,
"destroyed_aircraft_under20s", 1 );
110 if ( !isdefined(
self.destroyedAircraftTime ) )
112 self.destroyedAircraftTime = [];
115 if ( ( isdefined(
self.destroyedAircraftTime[ weapon ] ) ) && ( ( GetTime() -
self.destroyedAircraftTime[ weapon ] ) < 10000 ) )
117 self AddWeaponStat( weapon,
"destroyed_2aircraft_quickly", 1 );
118 self.destroyedAircraftTime[ weapon ] = undefined;
122 self.destroyedAircraftTime[ weapon ] = GetTime();
130 self AddWeaponStat( weapon,
"destroyed_aircraft", 1 );
136 if ( GetDvarInt(
"scr_debug_challenges", 0 ) )
140 if ( level.rankedMatch || level.arenaMatch || level.wagerMatch || SessionModeIsCampaignGame() )
151 if ( !isdefined( game[
"challenge"] ) )
153 game[
"challenge"] = [];
156 if ( !isdefined ( game[
"challenge"][team] ) )
158 game[
"challenge"][team] = [];
159 game[
"challenge"][team][
"plantedBomb"] =
false;
160 game[
"challenge"][team][
"destroyedBombSite"] =
false;
161 game[
"challenge"][team][
"capturedFlag"] =
false;
163 game[
"challenge"][team][
"allAlive"] =
true;
168 if (!isdefined(level.ChallengesCallbacks[
callback]))
169 level.ChallengesCallbacks[
callback] = [];
170 level.ChallengesCallbacks[
callback][level.ChallengesCallbacks[
callback].size] = func;
175 if ( !isdefined( level.ChallengesCallbacks ) )
178 if ( !isdefined( level.ChallengesCallbacks[
callback] ) )
181 if ( isdefined( data ) )
183 for ( i = 0; i < level.ChallengesCallbacks[
callback].size; i++ )
184 thread [[level.ChallengesCallbacks[
callback][i]]]( data );
188 for ( i = 0; i < level.ChallengesCallbacks[
callback].size; i++ )
189 thread [[level.ChallengesCallbacks[
callback][i]]]();
202 self endon(
"disconnect");
203 self endon(
"killMonitorReloads");
207 self waittill(
"reload");
208 currentWeapon =
self getCurrentWeapon();
209 if ( currentWeapon == level.weaponNone )
215 self.lastReloadTime = time;
217 if ( WeaponHasAttachment( currentWeapon,
"supply" ) || WeaponHasAttachment( currentWeapon,
"dualclip" ) )
226 self endon(
"disconnect" );
227 self endon(
"death" );
228 self endon(
"reloadThenKillTimedOut" );
229 self notify(
"reloadThenKillStart" );
230 self endon(
"reloadThenKillStart" );
236 self waittill (
"killed_enemy_player", time, weapon );
237 if ( reloadWeapon == weapon )
239 self AddPlayerStat(
"reload_then_kill_dualclip", 1 );
247 self endon(
"disconnect" );
248 self endon(
"death" );
249 self endon(
"reloadThenKillStart" );
251 self notify(
"reloadThenKillTimedOut" );
256 self.pers[
"bulletStreak"] = 0;
257 self.pers[
"lastBulletKillTime"] = 0;
258 self.pers[
"stickExplosiveKill"] = 0;
259 self.pers[
"carepackagesCalled"] = 0;
260 self.explosiveInfo = [];
266 if ( weapon.name ==
"ai_tank_drone_gun" )
268 if ( isdefined( eAttacker ) && isdefined( eAttacker.remoteWeapon ) && isdefined( eInflictor ) )
270 if (
IS_TRUE( eInflictor.controlled ) )
272 if ( eAttacker.remoteWeapon == eInflictor )
279 else if ( weapon.name ==
"ai_tank_drone_rocket" )
281 if ( isdefined( eInflictor ) && !isdefined( eInflictor.from_ai ) )
291 if ( weapon.name ==
"auto_gun_turret" )
293 if ( isdefined( eAttacker ) && isdefined( eAttacker.remoteWeapon ) && isdefined( eInflictor ) )
295 if ( eAttacker.remoteWeapon == eInflictor )
297 if (
IS_TRUE( eInflictor.controlled ) )
310 if ( player hasPerk(
"specialty_movefaster" ) )
312 player AddPlayerStat(
"perk_movefaster_kills", 1 );
314 if ( player hasPerk(
"specialty_noname" ) )
316 player AddPlayerStat(
"perk_noname_kills", 1 );
318 if ( player hasPerk(
"specialty_quieter" ) )
320 player AddPlayerStat(
"perk_quieter_kills", 1 );
322 if ( player hasPerk(
"specialty_longersprint" ) )
324 if ( isdefined ( player.lastSprintTime ) && ( GetTime() - player.lastSprintTime ) < 2500 )
326 player AddPlayerStat(
"perk_longersprint", 1 );
329 if ( player hasPerk(
"specialty_fastmantle" ) )
331 if ( ( isdefined ( player.lastSprintTime ) && ( GetTime() - player.lastSprintTime ) < 2500 ) && ( player PlayerAds() >= 1 ) )
333 player AddPlayerStat(
"perk_fastmantle_kills", 1 );
336 if ( player hasPerk(
"specialty_loudenemies" ) )
338 player AddPlayerStat(
"perk_loudenemies_kills", 1 );
341 if (
isStunned ==
true && player hasPerk(
"specialty_stunprotection" ) )
343 player AddPlayerStat(
"perk_protection_stun_kills", 1 );
346 activeEnemyEmp =
false;
348 if ( level.teambased )
350 foreach( team
in level.teams )
352 assert( isdefined( level.activeCounterUAVs[ team ] ) );
353 assert( isdefined( level.ActiveEMPs[ team ] ) );
355 if ( team == player.team )
360 if ( level.activeCounterUAVs[team] > 0 )
365 if( level.ActiveEMPs[ team ] > 0 )
367 activeEnemyEmp =
true;
373 assert( isdefined( level.activeCounterUAVs[ victim.entNum ] ) );
374 assert( isdefined( level.ActiveEMPs[ victim.entNum ] ) );
376 players = level.players;
377 for ( i = 0; i < players.size; i++ )
379 if ( players[i] != player )
381 if ( isdefined( level.activeCounterUAVs[players[i].entNum] ) && level.activeCounterUAVs[players[i].entNum] > 0 )
386 if( isdefined( level.ActiveEMPs[ players[ i ].entNum ] ) && level.ActiveEMPs[ players[ i ].entNum ] > 0 )
388 activeEnemyEmp =
true;
394 if ( activeCUAV ==
true || activeEnemyEmp ==
true )
396 if ( player hasPerk(
"specialty_immunecounteruav" ) )
398 player AddPlayerStat(
"perk_immune_cuav_kills", 1 );
402 activeUAVVictim =
false;
403 if ( level.teambased )
405 if ( level.activeUAVs[victim.team] > 0 )
407 activeUAVVictim =
true;
412 activeUAVVictim = ( isdefined( level.activeUAVs[victim.entNum] ) && level.activeUAVs[victim.entNum] > 0 );
416 if ( activeUAVVictim ==
true )
418 if ( player hasPerk(
"specialty_gpsjammer" ) )
420 player AddPlayerStat(
"perk_gpsjammer_immune_kills", 1 );
424 if ( player.lastWeaponChange + 5000 > time )
426 if ( player hasPerk(
"specialty_fastweaponswitch" ) )
428 player AddPlayerStat(
"perk_fastweaponswitch_kill_after_swap", 1 );
432 if ( player.scavenged ==
true )
434 if ( player hasPerk(
"specialty_scavenger" ) )
436 player AddPlayerStat(
"perk_scavenger_kills_after_resupply", 1 );
443 if ( weapon.name ==
"claymore" )
445 self.flakJacketClaymore[ attacker.clientid ] =
true;
447 self AddPlayerStat(
"survive_with_flak", 1 );
448 self.challenge_lastsurvivewithflakfrom = attacker;
449 self.challenge_lastsurvivewithflaktime = getTime();
456 self AddPlayerStat(
"earn_scorestreak_anteup", 1 );
457 if ( !isdefined(
self.challenge_anteup_earned ) )
459 self.challenge_anteup_earned = 0;
461 self.challenge_anteup_earned++;
462 if (
self.challenge_anteup_earned >= 5 )
464 self AddPlayerStat(
"earn_5_scorestreaks_anteup", 1 );
465 self.challenge_anteup_earned = 0;
475 if ( player.pers[
"lastBulletKillTime"] == time )
476 player.pers[
"bulletStreak"]++;
478 player.pers[
"bulletStreak"] = 1;
480 player.pers[
"lastBulletKillTime"] = time;
482 if ( data.victim.iDFlagsTime == time )
486 player AddPlayerStat(
"kill_enemy_through_wall", 1 );
487 if ( isdefined( weapon ) && weaponHasAttachment( weapon,
"fmj" ) )
489 player AddPlayerStat(
"kill_enemy_through_wall_with_fmj", 1 );
499 if ( !isdefined( player.score ) || player.score < 1 )
502 players = level.players;
503 if ( level.teamBased )
504 team = player.pers[
"team"];
508 highScore = player.score;
510 for( i = 0; i < players.size; i++ )
512 if ( !isdefined( players[i].score ) )
515 if ( players[i] == player )
518 if ( players[i].score < 1 )
521 if ( team !=
"all" && players[i].pers[
"team"] != team )
524 if ( players[i].score >= highScore )
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;
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;
557 self endon (
"disconnect" );
558 self endon (
"death" );
559 self endon (
"killDTPMonitor");
564 self waittill(
"dtp_end" );
565 self.dtpTime = getTime() + 4000;
572 self endon (
"disconnect" );
573 self endon (
"death" );
574 self endon (
"killMantleMonitor");
579 self waittill(
"mantle_start", mantleEndTime );
580 self.mantleTime = mantleEndTime;
586 self AddPlayerStat(
"disarm_hacked_carepackage", 1 );
591 if ( !isdefined(
self ) || !isplayer(
self ) )
594 self AddPlayerStat(
"destroy_car", 1 );
600 self.pers[
"killNemesis"]++;
601 if (
self.pers[
"killNemesis"] >= 5 )
603 self.pers[
"killNemesis"] = 0;
604 self AddPlayerStat(
"kill_nemesis", 1 );
610 self AddPlayerStat(
"kill_while_damaging_with_microwave_turret", 1 );
615 self AddPlayerStat(
"long_distance_hatchet_kill", 1 );
620 self AddPlayerStat(
"activate_cuav_while_enemy_satelite_active", 1 );
625 self.pers[
"longshotsPerLife"]++;
626 if (
self.pers[
"longshotsPerLife"] >= 3 )
628 self.pers[
"longshotsPerLife"] = 0;
629 self AddPlayerStat(
"longshot_3_onelife", 1 );
636 player = data.player;
637 winner = data.winner;
642 if ( level.teambased )
644 winnerScore = game[
"teamScores"][winner];
648 switch ( level.gameType )
653 if ( player.team == winner )
655 if ( game[
"challenge"][winner][
"allAlive"] )
657 player AddGameTypeStat(
"round_win_no_deaths", 1 );
659 if ( isdefined ( player.lastManSDDefeat3Enemies ) )
661 player AddGameTypeStat(
"last_man_defeat_3_enemies", 1 );
675 data = spawnstruct();
676 data.time = getTime();
677 if ( level.teamBased )
679 if ( isdefined( winner ) && isdefined( level.teams[winner] ) )
681 data.winner = winner;
686 if ( isdefined( winner ) )
688 data.winner = winner;
693 for ( index = 0; index < level.placement[
"all"].size; index++ )
695 data.player = level.placement[
"all"][index];
696 if ( isdefined( data.player ) )
707 data = spawnstruct();
708 data.time = getTime();
709 if ( level.teamBased )
711 if ( isdefined( winner ) && isdefined( level.teams[winner] ) )
713 data.winner = winner;
718 if ( isdefined( winner ) && isplayer( winner) )
720 data.winner = winner;
725 for ( index = 0; index < level.placement[
"all"].size; index++ )
727 data.player = level.placement[
"all"][index];
730 if ( isdefined( data.player ) )
734 data.player.completedGame =
true;
737 for( index = 0; index < level.players.size; index++ )
739 if ( !isdefined( level.players[index].completedGame ) || level.players[index].completedGame !=
true )
749 if ( isplayer ( player ) )
751 player AddPlayerStat(
"get_final_kill", 1 );
757 if ( !IsPlayer(
self ) )
761 if ( weapon.rootweapon.name ==
"hatchet" )
763 self AddPlayerStat(
"destroy_hcxd_with_hatchet", 1 );
769 if ( isdefined (
self.lastRescuedBy ) && isdefined (
self.lastRescuedTime ) )
771 if (
self.lastRescuedTime + 5000 > getTime() )
773 self.lastRescuedBy AddPlayerStat(
"defend_teammate_who_captured_package", 1 );
777 if( owner !=
self && ((level.teambased && owner.team !=
self.team) || !level.teambased) )
779 self AddPlayerStat(
"capture_enemy_carepackage", 1 );
786 if ( !IsPlayer(
self ) )
789 if ( isdefined( level.killstreakWeapons[weapon] ) )
791 if ( level.killstreakWeapons[weapon] ==
"dart" )
793 self AddPlayerStat(
"destroy_scorestreak_with_dart", 1 );
796 else if ( isdefined( weapon.isHeroWeapon ) && weapon.isHeroWeapon ==
true )
798 self AddPlayerStat(
"destroy_scorestreak_with_specialist", 1 );
800 else if ( WeaponHasAttachment( weapon,
"fmj",
"rf" ) )
802 self AddPlayerStat(
"destroy_scorestreak_rapidfire_fmj", 1 );
805 if ( !isdefined( playerControlled ) || playerControlled ==
false )
811 self addPlayerStat(
"destroy_ai_scorestreak_coldblooded", 1 );
817 self.pers[
"challenge_destroyed_ground"]++;
821 self.pers[
"challenge_destroyed_air"]++;
824 if (
self.pers[
"challenge_destroyed_ground"] > 0 &&
self.pers[
"challenge_destroyed_air"] > 0 )
826 self addPlayerStat(
"destroy_air_and_ground_blindeye_coldblooded", 1 );
827 self.pers[
"challenge_destroyed_air"] = 0;
828 self.pers[
"challenge_destroyed_ground"] = 0;
834 if ( !isdefined(
self.pers[
"challenge_destroyed_killstreak"] ) )
836 self.pers[
"challenge_destroyed_killstreak"] = 0;
838 self.pers[
"challenge_destroyed_killstreak"]++;
840 if (
self.pers[
"challenge_destroyed_killstreak"] >= 5 )
842 self.pers[
"challenge_destroyed_killstreak"] = 0;
843 self addWeaponStat( weapon,
"destroy_5_killstreak", 1 );
844 self addWeaponStat( weapon,
"destroy_5_killstreak_vehicle", 1 );
847 self addWeaponStat( weapon,
"destroy_killstreak", 1 );
849 weaponPickedUp =
false;
850 if( isdefined(
self.pickedUpWeapons ) && isdefined(
self.pickedUpWeapons[weapon] ) )
852 weaponPickedUp =
true;
854 self AddWeaponStat( weapon,
"destroyed", 1,
self.class_num, weaponPickedUp, undefined,
self.primaryLoadoutGunSmithVariantIndex,
self.secondaryLoadoutGunSmithVariantIndex );
862 self endon(
"disconnect" );
863 if ( !isdefined(
self.challenge_previousDestroyWeapon ) ||
self.challenge_previousDestroyWeapon != weapon )
865 self.challenge_previousDestroyWeapon = weapon;
866 self.challenge_previousDestroyCount = 0;
870 self.challenge_previousDestroyCount++;
876 if (
self.challenge_previousDestroyCount > 1 )
878 self addWeaponStat( weapon,
"destroy_2_killstreaks_rapidly", 1 );
884 if ( isdefined(
self.smokeGrenadeTime ) && isdefined(
self.smokeGrenadePosition ) )
886 if (
self.smokeGrenadeTime + 14000 > captureTime )
888 distSq = distanceSquared(
self.smokeGrenadePosition,
self.origin );
890 if ( distSq < 57600 )
894 self AddPlayerStat(
"capture_objective_in_smoke", 1 );
896 self AddWeaponStat( GetWeapon(
"willy_pete" ),
"CombatRecordStat", 1 );
902 if ( isdefined( level.capturedObjectiveFunction ) )
904 self [[level.capturedObjectiveFunction]]();
907 heroAbilityWasActiveRecently = ( isdefined(
self.heroAbilityActive ) || ( isdefined(
self.heroAbilityDectivateTime ) &&
self.heroAbilityDectivateTime > gettime() - 3000 ) );
908 if ( heroAbilityWasActiveRecently && isdefined(
self.heroAbility ) &&
self.heroAbility.name ==
"gadget_camo" )
910 scoreevents::processscoreevent(
"optic_camo_capture_objective",
self );
913 if ( isdefined( objective ) )
915 if (
self.challenge_objectiveDefensive === objective )
917 if ( (
VAL(
self.challenge_objectiveDefensiveKillcount, 0 ) > 0 ) &&
918 ( (
VAL(
self.recentKillCount, 0 ) > 2 ) || (
self.challenge_objectiveDefensiveTripleKillMedalOrBetterEarned ===
true ) ) )
920 self AddPlayerStat(
"triple_kill_defenders_and_capture", 1 );
922 self.challenge_objectiveDefensiveKillcount = 0;
923 self.challenge_objectiveDefensive = undefined;
924 self.challenge_objectiveDefensiveTripleKillMedalOrBetterEarned = undefined;
933 self AddPlayerStat(
"perk_hacker_destroy", 1 );
939 if ( !isdefined(
self.pers[
"bladeKills"] ) )
941 self.pers[
"bladeKills"] = 0;
943 self.pers[
"bladeKills"]++;
944 if (
self.pers[
"bladeKills"] >= 15 )
946 self.pers[
"bladeKills"] = 0;
947 self AddPlayerStat(
"kill_15_with_blade", 1 );
954 self AddPlayerStat(
"destroy_explosive", 1 );
959 self AddPlayerStat(
"assist", 1 );
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 );
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 );
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 );
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 );
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 );
1006 players = GetPlayers();
1007 for ( i = 0; i < players.size; i++ )
1009 if (isdefined( players[i].team ) && players[i].team == team )
1011 players[i] AddGameTypeStat( challenge, 1 );
1018 if ( level.hostForcedEnd )
1021 if ( !isdefined( winner ) )
1024 if ( level.teambased )
1026 if ( winner ==
"tie" )
1037 foreach ( team
in level.teams )
1039 if ( team == winner )
1042 teamScores += game[
"teamScores"][team];
1050 foreach ( team
in level.teams )
1052 if ( team == winner )
1055 if ( game[
"challenge"][team][challenge] )
1064 player = data.player;
1065 winner = data.winner;
1070 if ( level.teambased )
1072 winnerScore = game[
"teamScores"][winner];
1076 switch ( level.gameType )
1080 if ( player.team == winner )
1082 if ( winnerScore >= loserScore + 20 )
1084 player AddGameTypeStat(
"CRUSH", 1 );
1088 mostKillsLeastDeaths =
true;
1090 for ( index = 0; index < level.placement[
"all"].size; index++ )
1092 if ( level.placement[
"all"][index].deaths < player.deaths )
1094 mostKillsLeastDeaths =
false;
1096 if ( level.placement[
"all"][index].kills > player.kills )
1098 mostKillsLeastDeaths =
false;
1102 if ( mostKillsLeastDeaths && player.kills > 0 && level.placement[
"all"].size > 3 )
1104 player AddGameTypeStat(
"most_kills_least_deaths", 1 );
1110 if ( player == winner )
1112 if ( level.placement[
"all"].size >= 2 )
1114 secondPlace = level.placement[
"all"][1];
1115 if ( player.kills >= ( secondPlace.kills + 7 ) )
1117 player AddGameTypeStat(
"CRUSH", 1 );
1125 if ( player.team == winner )
1127 if ( loserScore == 0 )
1129 player AddGameTypeStat(
"SHUT_OUT", 1 );
1136 if ( player.team == winner )
1138 if ( winnerScore >= loserScore + 70 )
1140 player AddGameTypeStat(
"CRUSH", 1 );
1147 if ( player.team == winner && winnerScore > 0 )
1149 if ( winnerScore >= loserScore + 70 )
1151 player AddGameTypeStat(
"CRUSH", 1 );
1158 if ( player.team == winner && winnerScore > 0 )
1160 if ( winnerScore >= loserScore + 70 )
1162 player AddGameTypeStat(
"CRUSH", 1 );
1165 if ( player.team == winner && winnerScore > 0 )
1167 if ( winnerScore >= loserScore + 110 )
1169 player AddGameTypeStat(
"ANNIHILATION", 1 );
1176 if ( player.team == game[
"defenders"] && player.team == winner )
1178 if ( loserScore == 0 )
1180 player AddGameTypeStat(
"SHUT_OUT", 1 );
1187 if ( player.team == winner )
1189 if ( loserScore <= 1 )
1191 player AddGameTypeStat(
"CRUSH", 1 );
1202 if ( killCount >= 3 && isdefined(
self.lastKillWhenInjured ) )
1204 if (
self.lastKillWhenInjured + 5000 > getTime() )
1206 self AddPlayerStat(
"multikill_3_near_death", 1 );
1210 self AddWeaponStat( weapon,
"doublekill",
int( killCount / 2 ) );
1211 self AddWeaponStat( weapon,
"triplekill",
int( killCount / 3 ) );
1213 if ( weapon.isheroweapon )
1215 doubleKill = int( killCount / 2 );
1218 self AddPlayerStat(
"MULTIKILL_2_WITH_HEROWEAPON", doubleKill );
1220 tripleKill = int( killCount / 3 );
1223 self AddPlayerStat(
"MULTIKILL_3_WITH_HEROWEAPON", tripleKill );
1230 self AddGameTypeStat(
"kill_2_enemies_capturing_your_objective", 1 );
1244 event =
"hold_a_entire_match";
1247 event =
"hold_b_entire_match";
1250 event =
"hold_c_entire_match";
1261 self AddGameTypeStat(
"capture_b_first_minute", 1 );
1271 self AddPlayerStat(
"multikill_3_lmg_or_smg_hip_fire", 1 );
1276 if ( weapon.name ==
"planemortar" || weapon.name ==
"remote_missile_missile" || weapon.name ==
"remote_missile_bomblet" )
1284 origin =
self.origin;
1285 if ( level.teambased )
1288 foreach( player
in teammates.a )
1290 if ( player ==
self )
1292 distSq = distanceSquared( origin, player.origin );
1294 if ( distSq < 57600 )
1296 self AddPlayerStat(
"killed_dog_close_to_teammate", 1 );
1305 self endon (
"disconnect" );
1306 level endon (
"game_ended" );
1308 self notify (
"updateRecentZoneKills" );
1309 self endon (
"updateRecentZoneKills" );
1310 if ( !isdefined (
self.recentZoneKillCount) )
1311 self.recentZoneKillCount = 0;
1312 self.recentZoneKillCount++;
1316 if (
self.recentZoneKillCount > 1 )
1318 self AddPlayerStat(
"multikill_2_zone_attackers", 1 );
1321 self.recentZoneKillCount = 0;
1326 self AddPlayerStat(
"multikill_2_with_rcbomb", 1 );
1331 self AddPlayerStat(
"multikill_3_remote_missile", 1 );
1337 self AddPlayerStat(
"multikill_3_with_mgl", 1 );
1343 self AddGameTypeStat(
"immediate_capture", 1 );
1349 self AddGameTypeStat(
"contest_then_capture", 1 );
1355 self AddGameTypeStat(
"both_bombs_detonate_10_seconds", 1 );
1360 self.pers[
"carepackagesCalled"]++;
1362 if (
self.pers[
"carepackagesCalled"] >= 3 )
1364 self AddPlayerStat(
"call_in_3_care_packages", 1 );
1365 self.pers[
"carepackagesCalled"] = 0;
1371 if ( !IsPlayer( attacker ) )
1375 if ( damageType ==
"MOD_RIFLE_BULLET" || damageType ==
"MOD_PISTOL_BULLET" )
1377 attacker AddPlayerStat(
"destroyed_helicopter_with_bullet", 1 );
1386 self AddPlayerStat(
"destroy_qrdrone", 1 );
1388 if ( damageType ==
"MOD_RIFLE_BULLET" || damageType ==
"MOD_PISTOL_BULLET" )
1390 self AddPlayerStat(
"destroyed_qrdrone_with_bullet", 1 );
1399 if (
self hasPerk(
"specialty_noname" ) )
1401 self AddPlayerStat(
"destroy_helicopter", 1 );
1407 if ( !IsPlayer( attacker ) )
1412 if ( isdefined( weapon ) )
1416 attacker AddPlayerStat(
"destroy_aircraft_with_emp", 1 );
1418 else if ( weapon.name ==
"missile_drone_projectile" || weapon.name ==
"missile_drone" )
1420 attacker AddPlayerStat(
"destroy_aircraft_with_missile_drone", 1 );
1422 else if ( weapon.isBulletWeapon )
1424 attacker AddPlayerStat(
"shoot_aircraft", 1 );
1430 attacker AddPlayerStat(
"perk_nottargetedbyairsupport_destroy_aircraft", 1 );
1433 attacker AddPlayerStat(
"destroy_aircraft", 1 );
1435 if ( isdefined( playerControlled ) && playerControlled ==
false )
1439 attacker AddPlayerStat(
"destroy_ai_aircraft_using_blindeye", 1 );
1446 if ( !IsDefined(
self.class_num ) )
1451 primary =
self GetLoadoutItem(
self.class_num,
"primary" );
1456 secondary =
self GetLoadoutItem(
self.class_num,
"secondary" );
1457 if ( secondary != 0 )
1461 primarygrenade =
self GetLoadoutItem(
self.class_num,
"primarygrenade" );
1462 if ( primarygrenade != 0 )
1466 specialgrenade =
self GetLoadoutItem(
self.class_num,
"specialgrenade" );
1467 if ( specialgrenade != 0 )
1472 for ( numSpecialties = 0; numSpecialties < level.maxSpecialties; numSpecialties++ )
1474 perk =
self GetLoadoutItem(
self.class_num,
"specialty" + ( numSpecialties + 1 ) );
1481 self AddPlayerStat(
"killstreak_10_no_weapons_perks", 1 );
1486 self endon(
"disconnect");
1487 self endon(
"death");
1488 self notify(
"scavengedGrenade");
1489 self endon(
"scavengedGrenade");
1492 self notify(
"scavenged_primary_grenade" );
1495 self waittill(
"lethalGrenadeKill" );
1496 self AddPlayerStat(
"kill_with_resupplied_lethal_grenade", 1 );
1502 attacker AddPlayerStat(
"stun_aitank_wIth_emp_grenade", 1 );
1506 function playerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, sHitLoc, attackerStance, bledOut )
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;
1516 self endon(
"disconnect");
1518 data = spawnstruct();
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 ) )
1534 data.bledOut = bledOut;
1537 if ( isdefined( eInflictor ) && isdefined( eInflictor.lastWeaponBeforeToss ) )
1539 data.lastWeaponBeforeToss = eInflictor.lastWeaponBeforeToss;
1541 if ( isdefined( eInflictor ) && isdefined( eInflictor.ownerWeaponAtLaunch ) )
1543 data.ownerWeaponAtLaunch = eInflictor.ownerWeaponAtLaunch;
1549 if ( isdefined( eInflictor ) )
1551 if ( isdefined ( eInflictor.locking_on ) )
1553 wasLockingOn |= eInflictor.locking_on;
1556 if ( isdefined ( eInflictor.locked_on ) )
1558 wasLockingOn |= eInflictor.locked_on;
1564 wasLockingOn &= ( 1 << data.victim.entnum );
1565 if ( wasLockingOn != 0 )
1567 data.wasLockingOn =
true;
1571 data.wasLockingOn =
false;
1573 data.wasHacked = washacked;
1574 data.wasPlanting = data.victim.isplanting;
1575 data.wasUnderwater = data.victim IsPlayerUnderwater();
1576 if ( !isdefined( data.wasPlanting ) )
1578 data.wasPlanting =
false;
1580 data.wasDefusing = data.victim.isdefusing;
1581 if ( !isdefined( data.wasDefusing ) )
1583 data.wasDefusing =
false;
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;
1593 data.victimflashbackTime = data.victim.flashbackTime;
1595 data.victimElectrifiedBy = data.victim.electrifiedBy;
1596 data.victimHeroAbility = data.victim.heroAbility;
1597 data.victimWasInSlamState = data.victim IsSlamming();
1598 data.victimWasLungingWithArmBlades = data.victim IsGadgetMeleeCharging();
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;
1607 if ( !isdefined( data.victimflashbackTime ) )
1609 data.victimflashbackTime = 0;
1611 if ( !isdefined( data.victimCombatEfficiencyLastOnTime ) )
1613 data.victimCombatEfficiencyLastOnTime = 0;
1615 if ( !isdefined( data.victimSpeedburstLastOnTime ) )
1617 data.victimSpeedburstLastOnTime = 0;
1619 data.victimVisionPulseActivateTime = data.victim.visionPulseActivateTime;
1620 if ( !isdefined( data.victimVisionPulseActivateTime ) )
1622 data.victimVisionPulseActivateTime = 0;
1625 data.victimVisionPulseOrigin = data.victim.visionPulseOrigin;
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;
1641 if ( isdefined( data.victim.activeProximityGrenades ) )
1643 data.victimActiveProximityGrenades = [];
1645 ArrayRemoveValue( data.victim.activeProximityGrenades, undefined );
1647 foreach( proximityGrenade
in data.victim.activeProximityGrenades )
1649 proximityGrenadeInfo = SpawnStruct();
1650 proximityGrenadeInfo.origin = proximityGrenade.origin;
1651 data.victimActiveProximityGrenades[ data.victimActiveProximityGrenades.size ] = proximityGrenadeInfo;
1655 if ( isdefined( data.victim.activeBouncingBetties ) )
1657 data.victimActiveBouncingBetties = [];
1659 ArrayRemoveValue( data.victim.activeBouncingBetties, undefined );
1661 foreach( bouncingBetty
in data.victim.activeBouncingBetties )
1663 bouncingBettyInfo = SpawnStruct();
1664 bouncingBettyInfo.origin = bouncingBetty.origin;
1665 data.victimActiveBouncingBetties[ data.victimActiveBouncingBetties.size ] = bouncingBettyInfo;
1669 if ( isPlayer( attacker ) )
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();
1678 data.attackerflashbackTime = data.attacker.flashbackTime;
1680 data.attackerHeroAbility = data.attacker.heroAbility;
1681 if ( !isdefined( data.attackerflashbackTime ) )
1683 data.attackerflashbackTime = 0;
1685 data.attackerVisionPulseActivateTime = attacker.visionPulseActivateTime;
1686 if ( !isdefined( data.attackerVisionPulseActivateTime ) )
1688 data.attackerVisionPulseActivateTime = 0;
1691 data.attackerVisionPulseOrigin = attacker.visionPulseOrigin;
1692 if ( !isdefined( data.attackerStance ) )
1694 data.attackerStance = data.attacker getStance();
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() );
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 );
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;
1724 data.attacker_sprint_begin = data.attacker.challenge_sprint_begin;
1725 data.attacker_sprint_end = data.attacker.challenge_sprint_end;
1727 data.attacker_wallRanTwoOppositeWallsNoGround = data.attacker.wallRanTwoOppositeWallsNoGround;
1729 if ( ( level.allow_vehicle_challenge_check ===
true ) && attacker IsInVehicle() )
1731 vehicle = attacker GetVehicleOccupied();
1733 if ( isdefined( vehicle ) )
1735 data.attackerInVehicleArchetype = vehicle.archetype;
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;
1760 if ( isdefined( eInflictor ) )
1762 if ( isdefined( eInflictor.IsCooked ) )
1764 data.inflictorIsCooked = eInflictor.IsCooked;
1768 data.inflictorIsCooked =
false;
1771 if ( isdefined( eInflictor.Challenge_hatchetTossCount ) )
1773 data.inflictorChallenge_hatchetTossCount = eInflictor.Challenge_hatchetTossCount;
1777 data.inflictorChallenge_hatchetTossCount = 0;
1779 if ( isdefined( eInflictor.OwnerWasSprinting ) )
1781 data.inflictorOwnerWasSprinting = eInflictor.OwnerWasSprinting;
1785 data.inflictorOwnerWasSprinting =
false;
1787 if ( isdefined( eInflictor.PlayerHasEngineerPerk ) )
1789 data.inflictorPlayerHasEngineerPerk = eInflictor.PlayerHasEngineerPerk;
1793 data.inflictorPlayerHasEngineerPerk =
false;
1798 data.inflictorIsCooked =
false;
1799 data.inflictorChallenge_hatchetTossCount = 0;
1800 data.inflictorOwnerWasSprinting =
false;
1801 data.inflictorPlayerHasEngineerPerk =
false;
1807 data.attacker notify(
"playerKilledChallengesProcessed" );
1812 if ( !isdefined( level.scoreEventCallbacks ) )
1815 if ( !isdefined( level.scoreEventCallbacks[
callback] ) )
1818 if ( isdefined( data ) )
1820 for ( i = 0; i < level.scoreEventCallbacks[
callback].size; i++ )
1821 thread [[level.scoreEventCallbacks[
callback][i]]]( data );
1825 for ( i = 0; i < level.scoreEventCallbacks[
callback].size; i++ )
1826 thread [[level.scoreEventCallbacks[
callback][i]]]();
1832 if ( isdefined( data.attacker ) )
1833 data.attacker endon(
"disconnect");
1844 if ( weapon == level.weaponBaseMelee || weapon == level.weaponBaseMeleeHeld || weapon == level.weaponBallisticKnife )
1854 self endon(
"disconnect" );
1858 switch ( level.gameType )
1862 if ( eventName ==
"killstreak_10" )
1864 self AddGameTypeStat(
"killstreak_10", 1 );
1866 else if ( eventName ==
"killstreak_15" )
1868 self AddGameTypeStat(
"killstreak_15", 1 );
1870 else if ( eventName ==
"killstreak_20" )
1872 self AddGameTypeStat(
"killstreak_20", 1 );
1874 else if ( eventName ==
"multikill_3" )
1876 self AddGameTypeStat(
"multikill_3", 1 );
1878 else if ( eventName ==
"kill_enemy_who_killed_teammate" )
1880 self AddGameTypeStat(
"kill_enemy_who_killed_teammate", 1 );
1882 else if ( eventName ==
"kill_enemy_injuring_teammate" )
1884 self AddGameTypeStat(
"kill_enemy_injuring_teammate", 1 );
1890 if ( eventName ==
"killstreak_10" )
1892 self AddGameTypeStat(
"killstreak_10", 1 );
1894 else if ( eventName ==
"killstreak_15" )
1896 self AddGameTypeStat(
"killstreak_15", 1 );
1898 else if ( eventName ==
"killstreak_20" )
1900 self AddGameTypeStat(
"killstreak_20", 1 );
1902 else if ( eventName ==
"killstreak_30" )
1904 self AddGameTypeStat(
"killstreak_30", 1 );
1910 if ( eventName ==
"defused_bomb_last_man_alive" )
1912 self AddGameTypeStat(
"defused_bomb_last_man_alive", 1 );
1914 else if ( eventName ==
"elimination_and_last_player_alive" )
1916 self AddGameTypeStat(
"elimination_and_last_player_alive", 1 );
1918 else if ( eventName ==
"killed_bomb_planter" )
1920 self AddGameTypeStat(
"killed_bomb_planter", 1 );
1922 else if ( eventName ==
"killed_bomb_defuser" )
1924 self AddGameTypeStat(
"killed_bomb_defuser", 1 );
1930 if ( eventName ==
"kill_flag_carrier" )
1932 self AddGameTypeStat(
"kill_flag_carrier", 1 );
1934 else if ( eventName ==
"defend_flag_carrier" )
1936 self AddGameTypeStat(
"defend_flag_carrier", 1 );
1942 if ( eventName ==
"killed_bomb_planter" )
1944 self AddGameTypeStat(
"killed_bomb_planter", 1 );
1946 else if ( eventName ==
"killed_bomb_defuser" )
1948 self AddGameTypeStat(
"killed_bomb_defuser", 1 );
1959 self endon(
"disconnect");
1960 self endon(
"killPlayerSprintMonitor");
1961 self endon (
"death" );
1963 self.lastSprintTime = undefined;
1967 self waittill(
"sprint_begin");
1969 self waittill (
"sprint_end");
1971 self.lastSprintTime = GetTime();
1978 return isdefined(
self.flashEndTime ) && gettime() <
self.flashEndTime;
1983 return isdefined(
self._heat_wave_stuned_end ) && gettime() <
self._heat_wave_stuned_end;
1989 if ( isdefined( level.challenge_scorestreaksenabled ) && level.challenge_scorestreaksenabled ==
true )
1991 entities = GetDamageableEntArray( origin, radius );
1992 foreach( entity
in entities )
1994 if ( isdefined( entity.challenge_isScoreStreak ) )
1996 self AddPlayerStat(
"protect_streak_with_trophy", 1 );
2005 self endon(
"death" );