‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_gamerep.gsc
Go to the documentation of this file.
1 #insert scripts\shared\shared.gsh;
2 
3 #using scripts\shared\rank_shared;
4 
5 #using scripts\shared\bots\_bot;
6 
7 #namespace gamerep;
8 
9 function ‪init()
10 {
11  if ( !‪isGameRepEnabled() )
12  {
13  return;
14  }
15 
17  {
18  return;
19  }
20 
21  game["gameRepInitialized"] = true;
22 
23  game["gameRep"]["players"] = [];
24  game["gameRep"]["playerNames"] = [];
25  game["gameRep"]["max"] = [];
26  game["gameRep"]["playerCount"] = 0;
27 
29 }
30 
32 {
33  if ( !isdefined( game["gameRepInitialized"] ) || !game["gameRepInitialized"] )
34  return false;
35 
36  return true;
37 }
38 
40 {
42  return false;
43 
44  if ( !level.rankedMatch )
45  return false;
46 
47  return true;
48 }
49 
51 {
52  // this should match the thresholdExceeded_e in live_anticheat.cpp
53  THRESHOLD_EXCEEDED_SCORE = 0;
54  THRESHOLD_EXCEEDED_SCORE_PER_MIN = 1;
55  THRESHOLD_EXCEEDED_KILLS = 2;
56  THRESHOLD_EXCEEDED_DEATHS = 3;
57  THRESHOLD_EXCEEDED_KD_RATIO = 4;
58  THRESHOLD_EXCEEDED_KILLS_PER_MIN = 5;
59  THRESHOLD_EXCEEDED_PLANTS = 6;
60  THRESHOLD_EXCEEDED_DEFUSES = 7;
61  THRESHOLD_EXCEEDED_CAPTURES = 8;
62  THRESHOLD_EXCEEDED_DEFENDS = 9;
63  THRESHOLD_EXCEEDED_TOTAL_TIME_PLAYED = 10;
64  THRESHOLD_EXCEEDED_TACTICAL_INSERTION_USE = 11;
65  THRESHOLD_EXCEEDED_JOIN_ATTEMPTS = 12;
66  THRESHOLD_EXCEEDED_XP = 13;
67  THRESHOLD_EXCEEDED_SPLITSCREEN = 14;
68 
69  // Parameter Names (for individual players)
70  game["gameRep"]["params"] = [];
71 
72  game["gameRep"]["params"][0] = "score";
73  game["gameRep"]["params"][1] = "scorePerMin";
74  game["gameRep"]["params"][2] = "kills";
75  game["gameRep"]["params"][3] = "deaths";
76  game["gameRep"]["params"][4] = "killDeathRatio";
77  game["gameRep"]["params"][5] = "killsPerMin";
78  game["gameRep"]["params"][6] = "plants";
79  game["gameRep"]["params"][7] = "defuses";
80  game["gameRep"]["params"][8] = "captures";
81  game["gameRep"]["params"][9] = "defends";
82  game["gameRep"]["params"][10] = "totalTimePlayed";
83  game["gameRep"]["params"][11] = "tacticalInsertions";
84  game["gameRep"]["params"][12] = "joinAttempts";
85  game["gameRep"]["params"][13] = "xp";
86 
87  // New Param additions go here.
88 
89  // Parameters which we want to track, but not use for reporting. (for individual players)
90  game["gameRep"]["ignoreParams"] = [];
91  game["gameRep"]["ignoreParams"][0] = "totalTimePlayed";
92 
93  // Game limit parameters
94  game["gameRep"]["gameLimit"] = [];
95  game["gameRep"]["gameLimit"]["default"] = [];
96  game["gameRep"]["gameLimit"]["tdm"] = [];
97  game["gameRep"]["gameLimit"]["dm"] = [];
98  game["gameRep"]["gameLimit"]["dom"] = [];
99  game["gameRep"]["gameLimit"]["hq"] = [];
100  game["gameRep"]["gameLimit"]["sd"] = [];
101  game["gameRep"]["gameLimit"]["dem"] = [];
102  game["gameRep"]["gameLimit"]["ctf"] = [];
103  game["gameRep"]["gameLimit"]["koth"] = [];
104  game["gameRep"]["gameLimit"]["conf"] = [];
105 
106  // Score
107  game["gameRep"]["gameLimit"]["id"]["score"] = THRESHOLD_EXCEEDED_SCORE;
108  game["gameRep"]["gameLimit"]["default"]["score"] = 20000;
109 
110  // Score per min
111  game["gameRep"]["gameLimit"]["id"]["scorePerMin"] = THRESHOLD_EXCEEDED_SCORE_PER_MIN;
112  game["gameRep"]["gameLimit"]["default"]["scorePerMin"] = 250;
113  game["gameRep"]["gameLimit"]["dem"]["scorePerMin"] = 1000;
114  game["gameRep"]["gameLimit"]["tdm"]["scorePerMin"] = 700;
115  game["gameRep"]["gameLimit"]["dm"]["scorePerMin"] = 950;
116  game["gameRep"]["gameLimit"]["dom"]["scorePerMin"] = 1000;
117  game["gameRep"]["gameLimit"]["sd"]["scorePerMin"] = 200;
118  game["gameRep"]["gameLimit"]["ctf"]["scorePerMin"] = 600;
119  game["gameRep"]["gameLimit"]["hq"]["scorePerMin"] = 1000;
120  game["gameRep"]["gameLimit"]["koth"]["scorePerMin"] = 1000;
121  game["gameRep"]["gameLimit"]["conf"]["scorePerMin"] = 1000;
122 
123  // Kills
124  game["gameRep"]["gameLimit"]["id"]["kills"] = THRESHOLD_EXCEEDED_KILLS;
125  game["gameRep"]["gameLimit"]["default"]["kills"] = 75;
126  game["gameRep"]["gameLimit"]["tdm"]["kills"] = 40;
127  game["gameRep"]["gameLimit"]["sd"]["kills"] = 15;
128  game["gameRep"]["gameLimit"]["dm"]["kills"] = 31;
129 
130  // Deaths
131  game["gameRep"]["gameLimit"]["id"]["deaths"] = THRESHOLD_EXCEEDED_DEATHS;
132  game["gameRep"]["gameLimit"]["default"]["deaths"] = 50;
133  game["gameRep"]["gameLimit"]["dm"]["deaths"] = 15;
134  game["gameRep"]["gameLimit"]["tdm"]["deaths"] = 40;
135 
136  // KD Ratio
137  game["gameRep"]["gameLimit"]["id"]["killDeathRatio"] = THRESHOLD_EXCEEDED_KD_RATIO;
138  game["gameRep"]["gameLimit"]["default"]["killDeathRatio"] = 30;
139  game["gameRep"]["gameLimit"]["tdm"]["killDeathRatio"] = 50;
140  game["gameRep"]["gameLimit"]["sd"]["killDeathRatio"] = 20;
141 
142  // Kills per min
143  game["gameRep"]["gameLimit"]["id"]["killsPerMin"] = THRESHOLD_EXCEEDED_KILLS_PER_MIN;
144  game["gameRep"]["gameLimit"]["default"]["killsPerMin"] = 15;
145 
146  // Plants
147  game["gameRep"]["gameLimit"]["id"]["plants"] = THRESHOLD_EXCEEDED_PLANTS;
148  game["gameRep"]["gameLimit"]["default"]["plants"] = 10;
149 
150  // Defuses
151  game["gameRep"]["gameLimit"]["id"]["defuses"] = THRESHOLD_EXCEEDED_DEFUSES;
152  game["gameRep"]["gameLimit"]["default"]["defuses"] = 10;
153 
154  // Captures
155  game["gameRep"]["gameLimit"]["id"]["captures"] = THRESHOLD_EXCEEDED_CAPTURES;
156  game["gameRep"]["gameLimit"]["default"]["captures"] = 30;
157 
158  // Defends
159  game["gameRep"]["gameLimit"]["id"]["defends"] = THRESHOLD_EXCEEDED_DEFENDS;
160  game["gameRep"]["gameLimit"]["default"]["defends"] = 50;
161 
162  // Total Time played (in sec)
163  game["gameRep"]["gameLimit"]["id"]["totalTimePlayed"] = THRESHOLD_EXCEEDED_TOTAL_TIME_PLAYED;
164  game["gameRep"]["gameLimit"]["default"]["totalTimePlayed"] = 10 * 60;
165  game["gameRep"]["gameLimit"]["dom"]["totalTimePlayed"] = 10 * 60;
166  game["gameRep"]["gameLimit"]["dem"]["totalTimePlayed"] = 19 * 60;
167 
168  // Tactical Insertion use
169  game["gameRep"]["gameLimit"]["id"]["tacticalInsertions"] = THRESHOLD_EXCEEDED_TACTICAL_INSERTION_USE;
170  game["gameRep"]["gameLimit"]["default"]["tacticalInsertions"] = 20;
171 
172  // Join attempts
173  game["gameRep"]["gameLimit"]["id"]["joinAttempts"] = THRESHOLD_EXCEEDED_JOIN_ATTEMPTS;
174  game["gameRep"]["gameLimit"]["default"]["joinAttempts"] = 3;
175 
176  // XP
177  game["gameRep"]["gameLimit"]["id"]["xp"] = THRESHOLD_EXCEEDED_XP;
178  game["gameRep"]["gameLimit"]["default"]["xp"] = 25000;
179 
180  // Splitscreen (total)
181  game["gameRep"]["gameLimit"]["id"]["splitscreen"] = THRESHOLD_EXCEEDED_SPLITSCREEN;
182  game["gameRep"]["gameLimit"]["default"]["splitscreen"] = 8;
183 
184 }
185 
187 {
188  if ( !‪isGameRepEnabled() )
189  return;
190 
191  ‪name = self.name;
192 
193  if ( !isdefined( game["gameRep"]["players"][‪name] ) )
194  {
195  game["gameRep"]["players"][‪name] = [];
196 
197  for( j = 0; j < game["gameRep"]["params"].size; j++ )
198  {
199  paramName = game["gameRep"]["params"][j];
200  game["gameRep"]["players"][‪name][ paramName ] = 0;
201  }
202 
203  game["gameRep"]["players"][‪name]["splitscreen"] = self IsSplitScreen();
204  game["gameRep"]["players"][‪name]["joinAttempts"] = 1;
205  game["gameRep"]["players"][‪name]["connected"] = true;
206  game["gameRep"]["players"][‪name]["xpStart"] = self ‪rank::getRankXpStat();
207 
208  game["gameRep"]["playerNames"][ game["gameRep"]["playerCount"] ] = ‪name;
209  game["gameRep"]["playerCount"]++;
210  }
211  else
212  {
213  if ( !game["gameRep"]["players"][‪name]["connected"] )
214  {
215  game["gameRep"]["players"][‪name]["joinAttempts"]++;
216  game["gameRep"]["players"][‪name]["connected"] = true;
217  game["gameRep"]["players"][‪name]["xpStart"] = self ‪rank::getRankXpStat();
218  }
219  }
220 }
221 
223 {
224  if ( !‪isGameRepEnabled() )
225  return;
226 
227  ‪name = self.name;
228 
229  if( !isdefined( game["gameRep"]["players"][‪name] )
230  || !isdefined( self.pers["summary"] ) )
231  {
232  // we are probably migrating
233  return;
234  }
235 
238  game["gameRep"]["players"][‪name]["connected"] = false;
239 }
240 
242 {
243  ‪name = self.name;
244  if ( !isdefined( game["gameRep"]["players"][‪name] ) )
245  return;
246 
247  game["gameRep"]["players"][‪name]["totalTimePlayed"] += self.timePlayed["total"];
248 
249  if ( isdefined( self.tacticalInsertionCount ) )
250  game["gameRep"]["players"][‪name]["tacticalInsertions"] += self.tacticalInsertionCount;
251 
252  // New Non-Persistent Param Calculations go here.
253 
254  /*println( "gameRepUpdatePersistentPlayerInformation() for player " + name );
255  paramName = "totalTimePlayed";
256  println( "Param: " + paramName + "Value: " + getParamValueForPlayer( name, paramName ) );*/
257 }
258 
260 {
261  ‪name = self.name;
262  if ( !isdefined( game["gameRep"]["players"][‪name] ) )
263  return;
264 
265  if ( game["gameRep"]["players"][‪name]["totalTimePlayed"] != 0 )
266  timePlayed = game["gameRep"]["players"][‪name]["totalTimePlayed"];
267  else
268  timePlayed = 1;
269 
270  game["gameRep"]["players"][‪name]["score"] = self.score;
271  game["gameRep"]["players"][‪name]["scorePerMin"] = int( game["gameRep"]["players"][‪name]["score"] / ( timePlayed / 60 ) );
272 
273  game["gameRep"]["players"][‪name]["kills"] = self.kills;
274  game["gameRep"]["players"][‪name]["deaths"] = self.deaths;
275 
276  if ( game["gameRep"]["players"][‪name]["deaths"] != 0 )
277  game["gameRep"]["players"][‪name]["killDeathRatio"] = int( ( game["gameRep"]["players"][‪name]["kills"] / game["gameRep"]["players"][‪name]["deaths"] ) * 100 );
278  else
279  game["gameRep"]["players"][‪name]["killDeathRatio"] = game["gameRep"]["players"][‪name]["kills"] * 100;
280 
281 
282  game["gameRep"]["players"][‪name]["killsPerMin"] = int( game["gameRep"]["players"][‪name]["kills"] / ( timePlayed / 60 ) );
283 
284  game["gameRep"]["players"][‪name]["plants"] = self.plants;
285  game["gameRep"]["players"][‪name]["defuses"] = self.defuses;
286 
287  game["gameRep"]["players"][‪name]["captures"] = self.captures;
288  game["gameRep"]["players"][‪name]["defends"] = self.defends;
289 
290  game["gameRep"]["players"][‪name]["xp"] = self ‪rank::getRankXpStat() - game["gameRep"]["players"][‪name]["xpStart"];
291  game["gameRep"]["players"][‪name]["xpStart"] = self ‪rank::getRankXpStat();
292 
293  // New Persistent Param Calculations go here.
294 
295  /*println( "gameRepUpdatePersistentPlayerInformation() for player " + name );
296  for ( j = 0; j < game["gameRep"]["params"].size; j++ )
297  {
298  paramName = game["gameRep"]["params"][j];
299  if ( isGameRepParamValid( paramName ) )
300  println( "Param: " + paramName + "Value: " + getParamValueForPlayer( name, paramName ) );
301  }*/
302 }
303 
304 function ‪getParamValueForPlayer( playerName, paramName )
305 {
306  if ( isdefined( game["gameRep"]["players"][playerName][paramName] ) )
307  return game["gameRep"]["players"][playerName][paramName];
308 
309  assertmsg( "Unknown parameter " + paramName + "for individual player" );
310 }
311 
312 function ‪isGameRepParamValid( paramName )
313 {
314  gametype = level.gametype;
315 
316  if ( !isdefined( game["gameRep"] ) )
317  return false;
318 
319  if ( !isdefined( game["gameRep"]["gameLimit"] ) )
320  return false;
321 
322  if ( !isdefined( game["gameRep"]["gameLimit"][gametype] ) )
323  return false;
324 
325  if ( !isdefined( game["gameRep"]["gameLimit"][gametype][paramName] ) )
326  return false;
327 
328  if ( !isdefined( game["gameRep"]["gameLimit"][gametype][paramName] ) && !isdefined( game["gameRep"]["gameLimit"]["default"][paramName] ) )
329  return false;
330 
331  return true;
332 }
333 
335 {
336  if ( isdefined( game["gameRep"]["ignoreParams"][paramName] ) )
337  return true;
338 
339  return false;
340 }
341 
342 function ‪getGameRepParamLimit( paramName )
343 {
344  gametype = level.gametype;
345 
346  if ( isdefined( game["gameRep"]["gameLimit"][gametype] ) )
347  {
348  if ( isdefined( game["gameRep"]["gameLimit"][gametype][paramName] ) )
349  return game["gameRep"]["gameLimit"][gametype][paramName];
350  }
351 
352  if ( isdefined( game["gameRep"]["gameLimit"]["default"][paramName] ) )
353  return game["gameRep"]["gameLimit"]["default"][paramName];
354 
355  assertmsg( "Default values for parameter " + paramName + " is not defined." );
356 }
357 
358 function ‪setMaximumParamValueForCurrentGame( paramName, value )
359 {
360  if ( !isdefined( game["gameRep"]["max"][paramName] ) )
361  {
362  game["gameRep"]["max"][ paramName ] = value;
363  return;
364  }
365 
366  if ( game["gameRep"]["max"][ paramName ] < value )
367  {
368  game["gameRep"]["max"][ paramName ] = value;
369  }
370 }
371 
373 {
374  if ( !‪isGameRepEnabled() )
375  return;
376 
377  // We will update only non persistent data between rounds.
378  players = GetPlayers();
379  for( i = 0; i < players.size; i++ )
380  {
381  player = players[i];
383  }
384 }
385 
387 {
388  if ( !‪isGameRepEnabled() )
389  return;
390 
391  // Non persistent data is already updated at the end of the round.
392  // So, lets update only the persistent data for the current players.
393  players = GetPlayers();
394  for( i = 0; i < players.size; i++ )
395  {
396  player = players[i];
398  }
399 
400  splitscreenPlayerCount = 0;
401  // Set the maximums for this game (comparing for all players)
402  for ( i = 0; i < game["gameRep"]["playerNames"].size; i++ )
403  {
404  playerName = game["gameRep"]["playerNames"][i];
405 
406  // Individual Params
407  for ( j = 0; j < game["gameRep"]["params"].size; j++ )
408  {
409  paramName = game["gameRep"]["params"][j];
410  if ( ‪isGameRepParamValid( paramName ) )
411  ‪setMaximumParamValueForCurrentGame( paramName, ‪getParamValueForPlayer( playerName, paramName ) );
412  }
413 
414  // Splitscreen Players count
415  paramName = "splitscreen";
416  splitscreenPlayerCount += ‪getParamValueForPlayer( playerName, paramName );
417  }
418 
419  ‪setMaximumParamValueForCurrentGame( paramName, splitscreenPlayerCount );
420 
421  // Check if any of the params reached the maximum limit.
422  // If any of them reaches the maximum limit, then we will prepare and report this film.
423  for ( j = 0; j < game["gameRep"]["params"].size; j++ )
424  {
425  paramName = game["gameRep"]["params"][j];
426 
427  //println( "Param: " + paramName + " Max: " + game["gameRep"]["max"][ paramName ] + " Limit: " + getGameRepParamLimit( paramName ) );
428 
429  if ( ‪isGameRepParamValid( paramName ) && game["gameRep"]["max"][ paramName ] >= ‪getGameRepParamLimit( paramName ) )
430  {
431  ‪gameRepPrepareAndReport( paramName );
432  }
433  }
434 
435  paramName = "splitscreen";
436  if ( game["gameRep"]["max"][ paramName ] >= ‪getGameRepParamLimit( paramName ) )
437  {
438  ‪gameRepPrepareAndReport( paramName );
439  }
440 }
441 
442 function ‪gameRepPrepareAndReport( paramName )
443 {
444  if ( !isdefined( game["gameRep"]["gameLimit"]["id"][paramName] ) )
445  return;
446 
447  if ( ‪isGameRepParamIgnoredForReporting( paramName ) )
448  return;
449 
450  gameRepThresholdExceeded( game["gameRep"]["gameLimit"]["id"][ paramName ] );
451 }
‪gameRepPlayerDisconnected
‪function gameRepPlayerDisconnected()
Definition: _gamerep.gsc:222
‪setMaximumParamValueForCurrentGame
‪function setMaximumParamValueForCurrentGame(paramName, value)
Definition: _gamerep.gsc:358
‪getGameRepParamLimit
‪function getGameRepParamLimit(paramName)
Definition: _gamerep.gsc:342
‪init
‪function init()
Definition: _gamerep.gsc:9
‪isGameRepInitialized
‪function isGameRepInitialized()
Definition: _gamerep.gsc:31
‪isGameRepParamValid
‪function isGameRepParamValid(paramName)
Definition: _gamerep.gsc:312
‪gameRepPlayerConnected
‪function gameRepPlayerConnected()
Definition: _gamerep.gsc:186
‪isGameRepEnabled
‪function isGameRepEnabled()
Definition: _gamerep.gsc:39
‪isGameRepParamIgnoredForReporting
‪function isGameRepParamIgnoredForReporting(paramName)
Definition: _gamerep.gsc:334
‪is_bot_ranked_match
‪function is_bot_ranked_match()
Definition: _bot.gsc:80
‪gameRepUpdateInformationForRound
‪function gameRepUpdateInformationForRound()
Definition: _gamerep.gsc:372
‪getParamValueForPlayer
‪function getParamValueForPlayer(playerName, paramName)
Definition: _gamerep.gsc:304
‪gameRepUpdatePersistentPlayerInformation
‪function gameRepUpdatePersistentPlayerInformation()
Definition: _gamerep.gsc:259
‪gameRepPrepareAndReport
‪function gameRepPrepareAndReport(paramName)
Definition: _gamerep.gsc:442
‪gameRepInitializeParams
‪function gameRepInitializeParams()
Definition: _gamerep.gsc:50
‪gameRepUpdateNonPersistentPlayerInformation
‪function gameRepUpdateNonPersistentPlayerInformation()
Definition: _gamerep.gsc:241
‪gameRepAnalyzeAndReport
‪function gameRepAnalyzeAndReport()
Definition: _gamerep.gsc:386
‪name
‪class GroundFx name
‪getRankXpStat
‪function getRankXpStat()
Definition: rank_shared.gsc:385