1 #using scripts\shared\callbacks_shared;
2 #using scripts\shared\rank_shared;
3 #using scripts\shared\scoreevents_shared;
4 #using scripts\shared\system_shared;
5 #using scripts\shared\util_shared;
7 #using scripts\shared\bots\_bot;
9 #insert scripts\shared\shared.gsh;
11 #namespace persistence;
23 level.can_set_aar_stat =
true;
24 level.persistentDataInfo = [];
25 level.maxRecentStats = 10;
26 level.maxHitLocations = 19;
34 self.enableText =
true;
39 level.globalExecutions = 0;
40 level.globalChallenges = 0;
41 level.globalSharePackages = 0;
42 level.globalContractsFailed = 0;
43 level.globalContractsPassed = 0;
44 level.globalContractsCPPaid = 0;
45 level.globalKillstreaksCalled = 0;
46 level.globalKillstreaksDestroyed = 0;
47 level.globalKillstreaksDeathsFrom = 0;
48 level.globalLarrysKilled = 0;
49 level.globalBuzzKills = 0;
50 level.globalRevives = 0;
51 level.globalAfterlifes = 0;
52 level.globalComebacks = 0;
53 level.globalPaybacks = 0;
54 level.globalBackstabs = 0;
55 level.globalBankshots = 0;
56 level.globalSkewered = 0;
57 level.globalTeamMedals = 0;
58 level.globalFeetFallen = 0;
59 level.globalDistanceSprinted = 0;
60 level.globalDemBombsProtected = 0;
61 level.globalDemBombsDestroyed = 0;
62 level.globalBombsDestroyed = 0;
63 level.globalFragGrenadesFired = 0;
64 level.globalSatchelChargeFired = 0;
65 level.globalShotsFired = 0;
66 level.globalCrossbowFired = 0;
67 level.globalCarsDestroyed = 0;
68 level.globalBarrelsDestroyed = 0;
70 level.globalBombsDestroyedByTeam = [];
72 foreach( team
in level.teams )
74 level.globalBombsDestroyedByTeam[team] = 0;
80 level waittill(
"game_ended");
82 if ( !level.rankedMatch && !level.wagerMatch )
91 totalFlagsCaptured = 0;
92 totalFlagsReturned = 0;
93 totalHQsDestroyed = 0;
97 totalHumiliations = 0;
99 totalSabDestroyedByTeam = [];
100 foreach ( team
in level.teams )
102 totalSabDestroyedByTeam[team] = 0;
105 switch ( level.gameType )
111 for ( index = 0; index < level.bombZones.size; index++ )
113 if ( !isdefined( level.bombZones[index].bombExploded ) || !level.bombZones[index].bombExploded )
114 level.globalDemBombsProtected++;
116 level.globalDemBombsDestroyed++;
122 foreach ( team
in level.teams )
124 totalSabDestroyedByTeam[team] = level.globalBombsDestroyedByTeam[team];
130 players = GetPlayers();
131 for( i = 0; i < players.size; i++)
134 if ( isdefined( player.timePlayed ) && isdefined( player.timePlayed[
"total"] ) )
136 totalTimePlayed += min( player.timePlayed[
"total"], level.timeplayedcap );
145 players = GetPlayers();
146 for( i = 0; i < players.size; i++)
149 totalKills += player.kills;
150 totalDeaths += player.deaths;
151 totalAssists += player.assists;
152 totalHeadshots += player.headshots;
153 totalSuicides += player.suicides;
154 totalHumiliations += player.humiliated;
155 if ( isdefined( player.timePlayed ) && isdefined( player.timePlayed[
"alive"] ) )
157 totalTimePlayed += int( min( player.timePlayed[
"alive"], level.timeplayedcap ) );
160 switch ( level.gameType )
164 totalFlagsCaptured += player.captures;
165 totalFlagsReturned += player.returns;
170 totalHQsDestroyed += player.destructions;
171 totalHQsCaptured += player.captures;
176 totalSDDefused += player.defuses;
177 totalSDPlants += player.plants;
182 if ( isdefined(player.team) && isdefined( level.teams[ player.team ] ) )
184 totalSabDestroyedByTeam[player.team] += player.destructions;
200 if( isdefined( level.noPersistence ) && level.noPersistence )
203 if ( !level.onlineGame )
206 return (
self getdstat(
"PlayerStatsByGameType",
get_gametype_name(), dataName,
"StatValue" ) );
211 if ( !isdefined( level.fullGameTypeName ) )
213 if ( isdefined( level.hardcoreMode ) && level.hardcoreMode &&
is_party_gamemode() ==
false )
222 level.fullGameTypeName = toLower( prefix + level.gametype );
225 return level.fullGameTypeName;
231 switch( level.gametype )
246 return level.rankedMatch || level.wagerMatch;
251 if( isdefined( level.noPersistence ) && level.noPersistence )
257 if ( level.disableStatTracking )
262 self setdstat(
"PlayerStatsByGameType",
get_gametype_name(), dataName,
"StatValue", value );
272 if( level.wagerMatch )
274 return self getdstat(
"RecentEarnings", index, statName );
279 return self getdstat(
"gameHistory", modeName,
"matchHistory", index, statName );
283 return self getdstat(
"PlayerStatsByGameType",
get_gametype_name(),
"prevScores" , index, statName );
291 index =
self GetDStat(
"PlayerStatsByGameType",
get_gametype_name(),
"prevScoreIndex" );
293 if ( index < 0 || index > 9 )
297 if( isdefined( level.noPersistence ) && level.noPersistence )
300 if ( !level.onlineGame )
306 if( level.wagerMatch )
308 self setdstat(
"RecentEarnings", index, statName, value );
313 self setdstat(
"gameHistory", modeName,
"matchHistory",
"" + index, statName, value );
317 self setdstat(
"PlayerStatsByGameType",
get_gametype_name(),
"prevScores", index, statName, value );
323 if( isdefined( level.noPersistence ) && level.noPersistence )
326 if ( !level.onlineGame )
334 index =
self GetDStat(
"PlayerStatsByGameType",
get_gametype_name(),
"prevScoreIndex" );
336 if ( index < 0 || index > 9 )
347 historyIndex =
self GetDStat(
"gameHistory", modeName,
"currentMatchHistoryIndex" );
355 historyIndex =
self GetDStat(
"gameHistory", modeName,
"currentMatchHistoryIndex" );
362 if( isdefined( level.noPersistence ) && level.noPersistence )
365 if ( !level.onlineGame )
368 if ( !( level.rankedMatch || level.wagerMatch || level.leagueMatch ) )
371 self.pers[
"lastHighestScore"] =
self getDStat(
"HighestStats",
"highest_score" );
373 if (SessionModeIsMultiplayerGame())
375 self.pers[
"lastHighestKills"] =
self getDStat(
"HighestStats",
"highest_kills" );
376 self.pers[
"lastHighestKDRatio"] =
self getDStat(
"HighestStats",
"highest_kdratio" );
380 self GameHistoryStartMatch( getGameTypeEnumFromName( currGameType, level.hardcoreMode ) );
385 return level.can_set_aar_stat;
392 self setdstat(
"AfterActionReportStats",
"playerStats", playerIndex, statName, value );
400 self setdstat(
"AfterActionReportStats",
"playerStats", playerIndex,
"medals", medalIndex, value );
411 if ( isdefined( index ) )
412 self setAARStat( statName, index, value );
414 self setAARStat( statName, value );
420 params = Spawnstruct();
421 params.rewardXP = rewardXP;
422 params.maxVal = maxVal;
424 params.tableNumber = tableNumber;
425 params.challengeType = challengeType;
426 params.itemIndex = itemIndex;
427 params.challengeIndex = challengeIndex;
430 if ( SessionModeIsCampaignGame() )
432 if( isdefined(
self.challenge_callback_cp ) )
434 [[
self.challenge_callback_cp ]]( rewardXP, maxVal, row, tableNumber, challengeType, itemIndex, challengeIndex );
441 self LUINotifyEvent( &
"challenge_complete", 7, challengeIndex, itemIndex, challengeType, tableNumber, row, maxVal, rewardXP );
442 self LUINotifyEventToSpectators( &
"challenge_complete", 7, challengeIndex, itemIndex, challengeType, tableNumber, row, maxVal, rewardXP );
444 tableNumber = tableNumber + 1;
445 tableName =
"gamedata/stats/mp/statsmilestones" + tableNumber +
".csv";
446 challengeString = tableLookupColumnForRow( tableName, row, 5 );
447 challengeTier = int( tableLookupColumnForRow( tableName, row, 1 ) );
449 matchRecordLogChallengeComplete(
self, tableNumber, challengeTier, itemIndex, challengeString );
454 if ( SessionModeIsCampaignGame() )
456 self notify(
"gun_level_complete", rewardXP, attachmentIndex, itemIndex, rankID, isLastRank);
460 self LUINotifyEvent( &
"gun_level_complete", 4, rankID, itemIndex, attachmentIndex, rewardXP );
461 self LUINotifyEventToSpectators( &
"gun_level_complete", 4, rankID, itemIndex, attachmentIndex, rewardXP );
478 self notify(
"upload_stats_soon" );
479 self endon(
"upload_stats_soon" );
480 self endon(
"disconnect" );