‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_teams.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\persistence_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 
8 #insert scripts\shared\shared.gsh;
9 
10 #using scripts\mp\gametypes\_globallogic_ui;
11 #using scripts\mp\gametypes\_spectating;
12 
13 #using scripts\mp\_util;
14 
15 #precache( "material", "mpflag_spectator" );
16 #precache( "string", "MP_AUTOBALANCE_NOW" );
17 
18 #namespace teams;
19 
20 ‪REGISTER_SYSTEM( "teams", &‪__init__, undefined )
21 
22 function ‪__init__()
23 {
25 
26  level.getEnemyTeam = &‪getEnemyTeam;
27  level.use_team_based_logic_for_locking_on = true;
28 }
29 
30 function ‪init()
31 {
32  game["strings"]["autobalance"] = &"MP_AUTOBALANCE_NOW";
33 
34  if(GetDvarString( "scr_teambalance") == "")
35  SetDvar("scr_teambalance", "0");
36  level.teambalance = GetDvarint( "scr_teambalance");
37  level.teambalancetimer = 0;
38 
39  if(GetDvarString( "scr_timeplayedcap") == "")
40  SetDvar("scr_timeplayedcap", "1800");
41  level.timeplayedcap = int(GetDvarint( "scr_timeplayedcap"));
42 
43  level.freeplayers = [];
44 
45  if( level.teamBased )
46  {
47  level.alliesplayers = [];
48  level.axisplayers = [];
49 
53  level thread ‪update_balance_dvar();
54 
55  wait .15;
56  if ( level.onlineGame )
57  {
58  level thread ‪update_player_times();
59  }
60  }
61  else
62  {
64 
65  wait .15;
66  if ( level.onlineGame)
67  {
68  level thread ‪update_player_times();
69  }
70  }
71 }
72 
74 {
75  self thread ‪track_played_time();
76 }
77 
79 {
80  self thread ‪track_free_played_time();
81 }
82 
84 {
85  /#println( "joined team: " + self.pers["team"] );#/
86  self ‪update_time();
87 }
88 
90 {
91  self.pers["teamTime"] = undefined;
92 }
93 
95 {
96  self endon( "disconnect" );
97 
98  if ( !isdefined( self.pers["totalTimePlayed"] ) )
99  {
100  self.pers["totalTimePlayed"] = 0;
101  }
102 
103  foreach ( team in level.teams )
104  {
105  self.timePlayed[team] = 0;
106  }
107  self.timePlayed["free"] = 0;
108  self.timePlayed["other"] = 0;
109  self.timePlayed["alive"] = 0;
110 
111  // dont reset time played in War when going into final fight, this is used for calculating match bonus
112  if ( !isdefined( self.timePlayed["total"] ) || !( (level.gameType == "twar") && (0 < game["roundsplayed"]) && (0 < self.timeplayed["total"]) ) )
113  self.timePlayed["total"] = 0;
114 
115  while ( level.inPrematchPeriod )
117 
118  for ( ;; )
119  {
120  if ( game["state"] == "playing" )
121  {
122  if ( isdefined( level.teams[self.sessionteam] ) )
123  {
124  self.timePlayed[self.sessionteam]++;
125  self.timePlayed["total"]++;
126 
127  if ( level.mpCustomMatch )
128  {
129  self.pers["sbtimeplayed"] = self.timeplayed["total"];
130  self.sbtimeplayed = self.pers["sbtimeplayed"];
131  }
132 
133  if ( IsAlive( self ) )
134  self.timePlayed["alive"]++;
135  }
136  else if ( self.sessionteam == "spectator" )
137  {
138  self.timePlayed["other"]++;
139  }
140  }
141 
142  wait ( 1.0 );
143  }
144 }
145 
146 
148 {
149  const minWait = 10.0;
150  const step = 1.0;
151  varWait = minWait;
152 
153  nextToUpdate = 0;
154  for ( ;; )
155  {
156  varWait = varWait - step;
157  nextToUpdate++;
158 
159  if ( nextToUpdate >= level.players.size )
160  {
161  nextToUpdate = 0;
162 
163  if ( varWait > 0 )
164  {
165  wait ( varWait );
166  }
167 
168  varWait = minWait;
169  }
170 
171  if ( isdefined( level.players[nextToUpdate] ) )
172  {
173  level.players[nextToUpdate] ‪update_played_time();
174  level.players[nextToUpdate] ‪persistence::check_contract_expirations();
175  }
176 
177  wait ( step );
178  }
179 }
180 
182 {
183  pixbeginevent("updatePlayedTime");
184 
185  if ( level.rankedMatch || level.leagueMatch )
186  {
187  foreach( team in level.teams )
188  {
189  if ( self.timePlayed[team] )
190  {
191  if ( level.teambased )
192  {
193  self AddPlayerStat( "time_played_"+team, int( min( self.timePlayed[team], level.timeplayedcap ) ) );
194  }
195 
196  self AddPlayerStatWithGameType( "time_played_total", int( min( self.timePlayed[team], level.timeplayedcap ) ) );
197  }
198  }
199 
200  if ( self.timePlayed["other"] )
201  {
202  self AddPlayerStat( "time_played_other", int( min( self.timePlayed["other"], level.timeplayedcap ) ) );
203  self AddPlayerStatWithGameType( "time_played_total", int( min( self.timePlayed["other"], level.timeplayedcap ) ) );
204  }
205 
206  if ( self.timePlayed["alive"] )
207  {
208  timeAlive = int( min( self.timePlayed["alive"], level.timeplayedcap ) );
210  self AddPlayerStat( "time_played_alive", timeAlive );
211  }
212  }
213 
214  if ( level.onlineGame )
215  {
216  timeAlive = int( min( self.timePlayed["alive"], level.timeplayedcap ) );
217  self.pers["time_played_alive"] += timeAlive;
218  }
219 
220  pixendevent();
221 
222  if ( game["state"] == "postgame" )
223  return;
224 
225  foreach( team in level.teams )
226  {
227  self.timePlayed[team] = 0;
228  }
229  self.timePlayed["other"] = 0;
230  self.timePlayed["alive"] = 0;
231 }
232 
233 
234 function ‪update_time()
235 {
236  if ( game["state"] != "playing" )
237  return;
238 
239  self.pers["teamTime"] = getTime();
240 }
241 
243 {
244  for(;;)
245  {
246  teambalance = GetDvarint( "scr_teambalance");
247  if(level.teambalance != teambalance)
248  level.teambalance = GetDvarint( "scr_teambalance");
249 
250  timeplayedcap = GetDvarint( "scr_timeplayedcap");
251  if(level.timeplayedcap != timeplayedcap)
252  level.timeplayedcap = int(GetDvarint( "scr_timeplayedcap"));
253 
254  wait 1;
255  }
256 }
257 
258 function ‪change( team )
259 {
260  if (self.sessionstate != "dead")
261  {
262  // Set a flag on the player to they aren't robbed points for dying - the callback will remove the flag
263  self.switching_teams = true;
264  self.switchedTeamsResetGadgets = true;
265  self.joining_team = team;
266  self.leaving_team = self.pers["team"];
267 
268  // Suicide the player so they can't hit escape and fail the team balance
269  self ‪suicide();
270  }
271 
272  self.pers["team"] = team;
273  self.team = team;
274  self.pers["weapon"] = undefined;
275  self.pers["spawnweapon"] = undefined;
276  self.pers["savedmodel"] = undefined;
277  self.pers["teamTime"] = undefined;
278  self.sessionteam = self.pers["team"];
279 
281 
282  // update spectator permissions immediately on change of team
284 
285  self SetClientScriptMainMenu( game[ "menu_start_menu" ] );
286  self openMenu(game[ "menu_start_menu" ]);
287 
288  self notify("end_respawn");
289 }
290 
292 {
293  players = level.players;
294 
295  playerCounts = [];
296  foreach( team in level.teams )
297  {
298  playerCounts[team] = 0;
299  }
300 
301  foreach( player in level.players )
302  {
303  if( player == self )
304  continue;
305 
306  team = player.pers["team"];
307  if( isdefined(team) && isdefined( level.teams[team] ) )
308  playerCounts[team]++;
309  }
310  return playerCounts;
311 }
312 
313 
315 {
316  self endon( "disconnect" );
317 
318  foreach( team in level.teams )
319  {
320  self.timePlayed[team] = 0;
321  }
322 
323  self.timePlayed["other"] = 0;
324  self.timePlayed["total"] = 0;
325  self.timePlayed["alive"] = 0;
326 
327  for ( ;; )
328  {
329  if ( game["state"] == "playing" )
330  {
331  team = self.pers["team"];
332  if ( isdefined( team ) && isdefined( level.teams[team] ) && self.sessionteam != "spectator" )
333  {
334  self.timePlayed[team]++;
335  self.timePlayed["total"]++;
336  if ( IsAlive( self ) )
337  self.timePlayed["alive"]++;
338  }
339  else
340  {
341  self.timePlayed["other"]++;
342  }
343  }
344 
345  wait ( 1.0 );
346  }
347 }
348 
349 function ‪set_player_model( team, weapon )
350 {
351  self DetachAll();
352  self SetMoveSpeedScale( 1 );
353  self SetSprintDuration( 4 );
354  self SetSprintCooldown( 0 );
355 }
356 
357 function ‪get_flag_model( teamRef )
358 {
359  assert(isdefined(game["flagmodels"]));
360  assert(isdefined(game["flagmodels"][teamRef]));
361  return ( game["flagmodels"][teamRef] );
362 }
363 
364 function ‪get_flag_carry_model( teamRef )
365 {
366  assert(isdefined(game["carry_flagmodels"]));
367  assert(isdefined(game["carry_flagmodels"][teamRef]));
368  return ( game["carry_flagmodels"][teamRef] );
369 }
370 
371 function ‪getTeamIndex( team )
372 {
373  if( !isdefined( team ) )
374  {
375  return ‪TEAM_FREE;
376  }
377 
378  if( team == "free" )
379  {
380  return ‪TEAM_FREE;
381  }
382 
383  if( team == "allies" )
384  {
385  return ‪TEAM_ALLIES;
386  }
387 
388  if( team == "axis" )
389  {
390  return ‪TEAM_AXIS;
391  }
392 
393  return ‪TEAM_FREE;
394 }
395 
396 function ‪getEnemyTeam( player_team )
397 {
398  foreach( team in level.teams )
399  {
400  if ( team == player_team )
401  continue;
402 
403  if ( team == "spectator" )
404  continue;
405 
406  return team;
407  }
408 
409  return ‪util::getOtherTeam( player_team );
410 }
411 
413 {
414  enemies = [];
415 
416  foreach( player in level.players )
417  {
418  if( player.team == "spectator" )
419  {
420  continue;
421  }
422 
423  if( ( level.teamBased && player.team != self.team ) || ( !level.teamBased && player != self ) )
424  {
425  ‪ARRAY_ADD( enemies, player );
426  }
427  }
428 
429  return enemies;
430 }
431 
433 {
434  friendlies = [];
435 
436  foreach( player in level.players )
437  {
438  if( ( player.team == self.team ) && ( player != self ) )
439  {
440  ‪ARRAY_ADD( friendlies, player );
441  }
442  }
443 
444  return friendlies;
445 }
446 
447 function ‪WaitUntilTeamChange( player, ‪callback, arg, end_condition1, end_condition2, end_condition3 )
448 {
449  if( isdefined( end_condition1 ) )
450  self endon( end_condition1 );
451  if( isdefined( end_condition2 ) )
452  self endon( end_condition2 );
453  if( isdefined( end_condition3 ) )
454  self endon( end_condition3 );
455 
456  event = player ‪util::waittill_any( "joined_team", "disconnect", "joined_spectators" );
457 
458  if( isdefined( ‪callback ) )
459  {
460  self [[ ‪callback ]]( arg, event );
461  }
462 }
463 
464 
465 function ‪WaitUntilTeamChangeSingleTon( player, singletonString, ‪callback, arg, end_condition1, end_condition2, end_condition3 )
466 {
467  self notify( singletonString );
468  self endon( singletonString );
469  if( isdefined( end_condition1 ) )
470  self endon( end_condition1 );
471  if( isdefined( end_condition2 ) )
472  self endon( end_condition2 );
473  if( isdefined( end_condition3 ) )
474  self endon( end_condition3 );
475 
476  event = player ‪util::waittill_any( "joined_team", "disconnect", "joined_spectators" );
477 
478  if( isdefined( ‪callback ) )
479  {
480  self thread [[ ‪callback ]]( arg, event );
481  }
482 }
483 
484 
486 {
487  if( level.teambased )
488  {
489  self SetVisibleToAllExceptTeam( self.team );
490  }
491  else
492  {
493  self SetVisibleToAll();
494  self SetInvisibleToPlayer( self.owner );
495  }
496 }
497 
‪set_permissions
‪function set_permissions()
Definition: _spectating.gsc:98
‪callback
‪function callback(event, localclientnum, params)
Definition: callbacks_shared.csc:13
‪GetFriendlyPlayers
‪function GetFriendlyPlayers()
Definition: _teams.gsc:432
‪on_free_player_connect
‪function on_free_player_connect()
Definition: _teams.gsc:78
‪on_start_gametype
‪function on_start_gametype(func, obj)
Definition: callbacks_shared.csc:285
‪update_balance_dvar
‪function update_balance_dvar()
Definition: _teams.gsc:242
‪check_contract_expirations
‪function check_contract_expirations()
Definition: persistence_shared.gsc:464
‪init
‪function init()
Definition: _teams.gsc:30
‪on_player_connect
‪function on_player_connect()
Definition: _teams.gsc:73
‪__init__
‪function __init__()
Definition: _teams.gsc:22
‪on_joined_spectators
‪function on_joined_spectators()
Definition: _teams.gsc:89
‪get_flag_model
‪function get_flag_model(teamRef)
Definition: _teams.gsc:357
‪getOtherTeam
‪function getOtherTeam(team)
Definition: _util.gsc:360
‪update_played_time
‪function update_played_time()
Definition: _teams.gsc:181
‪HideToSameTeam
‪function HideToSameTeam()
Definition: _teams.gsc:485
‪suicide
‪function suicide()
Definition: _vehicle.gsc:1309
‪TEAM_AXIS
‪#define TEAM_AXIS
Definition: shared.gsh:158
‪get_flag_carry_model
‪function get_flag_carry_model(teamRef)
Definition: _teams.gsc:364
‪track_free_played_time
‪function track_free_played_time()
Definition: _teams.gsc:314
‪track_played_time
‪function track_played_time()
Definition: _teams.gsc:94
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪update_player_times
‪function update_player_times()
Definition: _teams.gsc:147
‪getTeamIndex
‪function getTeamIndex(team)
Definition: _teams.gsc:371
‪count_players
‪function count_players()
Definition: _teams.gsc:291
‪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
‪GetEnemyPlayers
‪function GetEnemyPlayers()
Definition: _teams.gsc:412
‪TEAM_ALLIES
‪#define TEAM_ALLIES
Definition: shared.gsh:157
‪on_joined_spectate
‪function on_joined_spectate(func, obj)
Definition: callbacks_shared.gsc:290
‪on_joined_team
‪function on_joined_team()
Definition: _teams.gsc:83
‪WaitUntilTeamChangeSingleTon
‪function WaitUntilTeamChangeSingleTon(player, singletonString, callback, arg, end_condition1, end_condition2, end_condition3)
Definition: _teams.gsc:465
‪set_player_model
‪function set_player_model(team, weapon)
Definition: _teams.gsc:349
‪change
‪function change(team)
Definition: _teams.gsc:258
‪TEAM_FREE
‪#define TEAM_FREE
Definition: shared.gsh:156
‪updateObjectiveText
‪function updateObjectiveText()
Definition: _globallogic_ui.gsc:397
‪WaitUntilTeamChange
‪function WaitUntilTeamChange(player, callback, arg, end_condition1, end_condition2, end_condition3)
Definition: _teams.gsc:447
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪getEnemyTeam
‪function getEnemyTeam(player_team)
Definition: _teams.gsc:396
‪update_time
‪function update_time()
Definition: _teams.gsc:234
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265