‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
persistence_shared.gsc
Go to the documentation of this file.
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;
6 
7 #using scripts\shared\bots\_bot;
8 
9 #insert scripts\shared\shared.gsh;
10 
11 #namespace persistence;
12 
13 ‪REGISTER_SYSTEM( "persistence", &‪__init__, undefined )
14 
15 function ‪__init__()
16 {
19 }
20 
21 function ‪init()
22 {
23  level.can_set_aar_stat = true;
24  level.persistentDataInfo = [];
25  level.maxRecentStats = 10;
26  level.maxHitLocations = 19;
27 
28  level thread ‪initialize_stat_tracking();
29  level thread ‪upload_global_stat_counters();
30 }
31 
33 {
34  self.enableText = true;
35 }
36 
38 {
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;
69 
70  level.globalBombsDestroyedByTeam = [];
71 
72  foreach( team in level.teams )
73  {
74  level.globalBombsDestroyedByTeam[team] = 0;
75  }
76 }
77 
79 {
80  level waittill("game_ended");
81 
82  if ( !level.rankedMatch && !level.wagerMatch )
83  return;
84 
85  totalKills = 0;
86  totalDeaths = 0;
87  totalAssists = 0;
88  totalHeadshots = 0;
89  totalSuicides = 0;
90  totalTimePlayed = 0;
91  totalFlagsCaptured = 0;
92  totalFlagsReturned = 0;
93  totalHQsDestroyed = 0;
94  totalHQsCaptured = 0;
95  totalSDDefused = 0;
96  totalSDPlants = 0;
97  totalHumiliations = 0;
98 
99  totalSabDestroyedByTeam = [];
100  foreach ( team in level.teams )
101  {
102  totalSabDestroyedByTeam[team] = 0;
103  }
104 
105  switch ( level.gameType )
106  {
107  case "dem":
108  {
109  bombZonesLeft = 0;
110 
111  for ( index = 0; index < level.bombZones.size; index++ )
112  {
113  if ( !isdefined( level.bombZones[index].bombExploded ) || !level.bombZones[index].bombExploded )
114  level.globalDemBombsProtected++;
115  else
116  level.globalDemBombsDestroyed++;
117  }
118  }
119  break;
120  case "sab":
121  {
122  foreach ( team in level.teams )
123  {
124  totalSabDestroyedByTeam[team] = level.globalBombsDestroyedByTeam[team];
125  }
126  }
127  break;
128  }
129 
130  players = GetPlayers();
131  for( i = 0; i < players.size; i++)
132  {
133  player = players[i];
134  if ( isdefined( player.timePlayed ) && isdefined( player.timePlayed["total"] ) )
135  {
136  totalTimePlayed += min( player.timePlayed["total"], level.timeplayedcap );
137  }
138  }
139 
140  if ( !‪util::wasLastRound() )
141  return;
142 
144 
145  players = GetPlayers();
146  for( i = 0; i < players.size; i++)
147  {
148  player = players[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"] ) )
156  {
157  totalTimePlayed += int( min( player.timePlayed["alive"], level.timeplayedcap ) );
158  }
159 
160  switch ( level.gameType )
161  {
162  case "ctf":
163  {
164  totalFlagsCaptured += player.captures;
165  totalFlagsReturned += player.returns;
166  }
167  break;
168  case "koth":
169  {
170  totalHQsDestroyed += player.destructions;
171  totalHQsCaptured += player.captures;
172  }
173  break;
174  case "sd":
175  {
176  totalSDDefused += player.defuses;
177  totalSDPlants += player.plants;
178  }
179  break;
180  case "sab":
181  {
182  if ( isdefined(player.team) && isdefined( level.teams[ player.team ] ) )
183  {
184  totalSabDestroyedByTeam[player.team] += player.destructions;
185  }
186  }
187  break;
188  }
189  }
190 
191 }
192 
193 // ==========================================
194 // Script persistent data functions
195 // These are made for convenience, so persistent data can be tracked by strings.
196 // They make use of code functions which are prototyped below.
197 
198 function ‪stat_get_with_gametype( dataName )
199 {
200  if( isdefined( level.noPersistence ) && level.noPersistence )
201  return 0;
202 
203  if ( !level.onlineGame )
204  return 0;
205 
206  return ( self getdstat( "PlayerStatsByGameType", ‪get_gametype_name(), dataName, "StatValue" ) );
207 }
208 
210 {
211  if ( !isdefined( level.fullGameTypeName ) )
212  {
213  if ( isdefined( level.hardcoreMode ) && level.hardcoreMode && ‪is_party_gamemode() == false )
214  {
215  prefix = "HC";
216  }
217  else
218  {
219  prefix = "";
220  }
221 
222  level.fullGameTypeName = toLower( prefix + level.gametype );
223  }
224 
225  return level.fullGameTypeName;
226 
227 }
228 
230 {
231  switch( level.gametype )
232  {
233  case "gun":
234  case "oic":
235  case "shrp":
236  case "sas":
237  return true;
238  break;
239 
240  }
241  return false;
242 }
243 
244 function ‪is_stat_modifiable( dataName )
245 {
246  return level.rankedMatch || level.wagerMatch;
247 }
248 
249 function ‪stat_set_with_gametype( dataName, value, incValue )
250 {
251  if( isdefined( level.noPersistence ) && level.noPersistence )
252  return 0;
253 
254  if ( !‪is_stat_modifiable( dataName ) )
255  return;
256 
257  if ( level.disableStatTracking )
258  {
259  return;
260  }
261 
262  self setdstat( "PlayerStatsByGameType", ‪get_gametype_name(), dataName, "StatValue", value );
263 }
264 
266 {
268 }
269 
270 function ‪get_recent_stat( isGlobal, index, statName )
271 {
272  if( level.wagerMatch )
273  {
274  return self getdstat( "RecentEarnings", index, statName );
275  }
276  else if( isGlobal )
277  {
278  modeName = ‪util::GetCurrentGameMode();
279  return self getdstat( "gameHistory", modeName, "matchHistory", index, statName );
280  }
281  else
282  {
283  return self getdstat( "PlayerStatsByGameType", ‪get_gametype_name(), "prevScores" , index, statName );
284  }
285 }
286 
287 function ‪set_recent_stat( isGlobal, index, statName, value )
288 {
289  if ( !isGlobal )
290  {
291  index = self GetDStat( "PlayerStatsByGameType", ‪get_gametype_name(), "prevScoreIndex" );
292 
293  if ( index < 0 || index > 9 )
294  return;
295  }
296 
297  if( isdefined( level.noPersistence ) && level.noPersistence )
298  return;
299 
300  if ( !level.onlineGame )
301  return;
302 
303  if ( !‪is_stat_modifiable( statName ) )
304  return;
305 
306  if( level.wagerMatch )
307  {
308  self setdstat( "RecentEarnings", index, statName, value );
309  }
310  else if( isGlobal )
311  {
312  modeName = ‪util::GetCurrentGameMode();
313  self setdstat( "gameHistory", modeName, "matchHistory", "" + index, statName, value );
314  }
315  else
316  {
317  self setdstat( "PlayerStatsByGameType", ‪get_gametype_name(), "prevScores", index, statName, value );
318  }
319 }
320 
321 function ‪add_recent_stat( isGlobal, index, statName, value )
322 {
323  if( isdefined( level.noPersistence ) && level.noPersistence )
324  return;
325 
326  if ( !level.onlineGame )
327  return;
328 
329  if ( !‪is_stat_modifiable( statName ) )
330  return;
331 
332  if ( !isGlobal )
333  {
334  index = self GetDStat( "PlayerStatsByGameType", ‪get_gametype_name(), "prevScoreIndex" );
335 
336  if ( index < 0 || index > 9 )
337  return;
338  }
339 
340  currStat = ‪get_recent_stat( isGlobal, index, statName );
341  ‪set_recent_stat( isGlobal, index, statName, currStat + value );
342 }
343 
344 function ‪set_match_history_stat( statName, value )
345 {
346  modeName = ‪util::GetCurrentGameMode();
347  historyIndex = self GetDStat( "gameHistory", modeName, "currentMatchHistoryIndex" );
348 
349  ‪set_recent_stat( true, historyIndex, statName, value );
350 }
351 
352 function ‪add_match_history_stat( statName, value )
353 {
354  modeName = ‪util::GetCurrentGameMode();
355  historyIndex = self GetDStat( "gameHistory", modeName, "currentMatchHistoryIndex" );
356 
357  ‪add_recent_stat( true, historyIndex, statName, value );
358 }
359 
361 {
362  if( isdefined( level.noPersistence ) && level.noPersistence )
363  return;
364 
365  if ( !level.onlineGame )
366  return;
367 
368  if ( !( level.rankedMatch || level.wagerMatch || level.leagueMatch ) )
369  return;
370 
371  self.pers["lastHighestScore"] = self getDStat( "HighestStats", "highest_score" );
372 
373  if (SessionModeIsMultiplayerGame())
374  {
375  self.pers["lastHighestKills"] = self getDStat( "HighestStats", "highest_kills" );
376  self.pers["lastHighestKDRatio"] = self getDStat( "HighestStats", "highest_kdratio" );
377  }
378 
379  currGameType = ‪get_gametype_name();
380  self GameHistoryStartMatch( getGameTypeEnumFromName( currGameType, level.hardcoreMode ) );
381 }
382 
384 {
385  return level.can_set_aar_stat;
386 }
387 
388 function ‪set_after_action_report_player_stat( playerIndex, statName, value )
389 {
390  if ( ‪can_set_aar_stat() )
391  {
392  self setdstat( "AfterActionReportStats", "playerStats", playerIndex, statName, value );
393  }
394 }
395 
396 function ‪set_after_action_report_player_medal( playerIndex, medalIndex, value )
397 {
398  if ( ‪can_set_aar_stat() )
399  {
400  self setdstat( "AfterActionReportStats", "playerStats", playerIndex, "medals", medalIndex, value );
401  }
402 }
403 
404 function ‪set_after_action_report_stat( statName, value, index )
405 {
406  if( self ‪util::is_bot() )
407  return;
408 
409  if ( ‪can_set_aar_stat() )
410  {
411  if ( isdefined( index ) )
412  self setAARStat( statName, index, value );
413  else
414  self setAARStat( statName, value );
415  }
416 }
417 
418 function ‪CodeCallback_ChallengeComplete( rewardXP, maxVal, row, tableNumber, challengeType, itemIndex, challengeIndex )
419 {
420  params = Spawnstruct();
421  params.rewardXP = rewardXP;
422  params.maxVal = maxVal;
423  params.row = row;
424  params.tableNumber = tableNumber;
425  params.challengeType = challengeType;
426  params.itemIndex = itemIndex;
427  params.challengeIndex = challengeIndex;
428 
429  //No campaign notifications, handled in AAR
430  if ( SessionModeIsCampaignGame() )
431  {
432  if( isdefined( self.challenge_callback_cp ) )
433  {
434  [[ self.challenge_callback_cp ]]( rewardXP, maxVal, row, tableNumber, challengeType, itemIndex, challengeIndex );
435  }
436  return;
437  }
438 
439  ‪callback::callback( #"on_challenge_complete", params );
440 
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 );
443 
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 ) );
448 
449  matchRecordLogChallengeComplete( self, tableNumber, challengeTier, itemIndex, challengeString );
450 }
451 
452 function ‪CodeCallback_GunChallengeComplete( rewardXP, attachmentIndex, itemIndex, rankID, isLastRank )
453 {
454  if ( SessionModeIsCampaignGame() )
455  {
456  self notify("gun_level_complete", rewardXP, attachmentIndex, itemIndex, rankID, isLastRank);
457  return;
458  }
459 
460  self LUINotifyEvent( &"gun_level_complete", 4, rankID, itemIndex, attachmentIndex, rewardXP );
461  self LUINotifyEventToSpectators( &"gun_level_complete", 4, rankID, itemIndex, attachmentIndex, rewardXP );
462 }
463 
465 {
466 }
467 
468 function ‪increment_contract_times( timeInc )
469 {
470 }
471 
472 function ‪add_contract_to_queue( index, passed )
473 {
474 }
475 
477 {
478  self notify( "upload_stats_soon" );
479  self endon( "upload_stats_soon" );
480  self endon( "disconnect" );
481 
482  wait 1;
483  UploadStats( self );
484 }
485 
486 function ‪CodeCallback_OnAddPlayerStat(dataName, value)
487 {
488 }
489 
490 function ‪CodeCallback_OnAddWeaponStat(weapon, dataName, value)
491 {
492 }
493 
494 function ‪process_contracts_on_add_stat(statType, dataName, value, weapon)
495 {
496 }
‪set_after_action_report_player_stat
‪function set_after_action_report_player_stat(playerIndex, statName, value)
Definition: persistence_shared.gsc:388
‪callback
‪function callback(event, localclientnum, params)
Definition: callbacks_shared.csc:13
‪is_party_gamemode
‪function is_party_gamemode()
Definition: persistence_shared.gsc:229
‪upload_stats_soon
‪function upload_stats_soon()
Definition: persistence_shared.gsc:476
‪is_bot
‪function is_bot()
Definition: util_shared.gsc:2488
‪set_after_action_report_stat
‪function set_after_action_report_stat(statName, value, index)
Definition: persistence_shared.gsc:404
‪add_contract_to_queue
‪function add_contract_to_queue(index, passed)
Definition: persistence_shared.gsc:472
‪CodeCallback_OnAddWeaponStat
‪function CodeCallback_OnAddWeaponStat(weapon, dataName, value)
Definition: persistence_shared.gsc:490
‪on_start_gametype
‪function on_start_gametype(func, obj)
Definition: callbacks_shared.csc:285
‪CodeCallback_OnAddPlayerStat
‪function CodeCallback_OnAddPlayerStat(dataName, value)
Definition: persistence_shared.gsc:486
‪add_match_history_stat
‪function add_match_history_stat(statName, value)
Definition: persistence_shared.gsc:352
‪set_match_history_stat
‪function set_match_history_stat(statName, value)
Definition: persistence_shared.gsc:344
‪add_recent_stat
‪function add_recent_stat(isGlobal, index, statName, value)
Definition: persistence_shared.gsc:321
‪check_contract_expirations
‪function check_contract_expirations()
Definition: persistence_shared.gsc:464
‪process_contracts_on_add_stat
‪function process_contracts_on_add_stat(statType, dataName, value, weapon)
Definition: persistence_shared.gsc:494
‪set_after_action_report_player_medal
‪function set_after_action_report_player_medal(playerIndex, medalIndex, value)
Definition: persistence_shared.gsc:396
‪CodeCallback_ChallengeComplete
‪function CodeCallback_ChallengeComplete(rewardXP, maxVal, row, tableNumber, challengeType, itemIndex, challengeIndex)
Definition: persistence_shared.gsc:418
‪__init__
‪function __init__()
Definition: persistence_shared.gsc:15
‪wasLastRound
‪function wasLastRound()
Definition: util_shared.gsc:3521
‪GetCurrentGameMode
‪function GetCurrentGameMode()
Definition: util_shared.gsc:3750
‪upload_global_stat_counters
‪function upload_global_stat_counters()
Definition: persistence_shared.gsc:78
‪init
‪function init()
Definition: persistence_shared.gsc:21
‪stat_set_with_gametype
‪function stat_set_with_gametype(dataName, value, incValue)
Definition: persistence_shared.gsc:249
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪increment_contract_times
‪function increment_contract_times(timeInc)
Definition: persistence_shared.gsc:468
‪get_gametype_name
‪function get_gametype_name()
Definition: persistence_shared.gsc:209
‪on_player_connect
‪function on_player_connect()
Definition: persistence_shared.gsc:32
‪get_recent_stat
‪function get_recent_stat(isGlobal, index, statName)
Definition: persistence_shared.gsc:270
‪set_recent_stat
‪function set_recent_stat(isGlobal, index, statName, value)
Definition: persistence_shared.gsc:287
‪can_set_aar_stat
‪function can_set_aar_stat()
Definition: persistence_shared.gsc:383
‪initialize_stat_tracking
‪function initialize_stat_tracking()
Definition: persistence_shared.gsc:37
‪initialize_match_stats
‪function initialize_match_stats()
Definition: persistence_shared.gsc:360
‪stat_get_with_gametype
‪function stat_get_with_gametype(dataName)
Definition: persistence_shared.gsc:198
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪is_stat_modifiable
‪function is_stat_modifiable(dataName)
Definition: persistence_shared.gsc:244
‪adjust_recent_stats
‪function adjust_recent_stats()
Definition: persistence_shared.gsc:265
‪CodeCallback_GunChallengeComplete
‪function CodeCallback_GunChallengeComplete(rewardXP, attachmentIndex, itemIndex, rankID, isLastRank)
Definition: persistence_shared.gsc:452
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265