‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_globallogic_ui.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\hud_util_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 
8 #insert scripts\shared\shared.gsh;
9 
10 #using scripts\zm\gametypes\_globallogic;
11 #using scripts\zm\gametypes\_globallogic_player;
12 #using scripts\zm\gametypes\_spectating;
13 
14 #using scripts\zm\_util;
15 
16 #precache( "string", "MP_HALFTIME" );
17 #precache( "string", "MP_OVERTIME" );
18 #precache( "string", "MP_ROUNDEND" );
19 #precache( "string", "MP_INTERMISSION" );
20 #precache( "string", "MP_SWITCHING_SIDES_CAPS" );
21 #precache( "string", "MP_FRIENDLY_FIRE_WILL_NOT" );
22 #precache( "string", "MP_RAMPAGE" );
23 #precache( "string", "MP_ENDED_GAME" );
24 #precache( "string", "MP_HOST_ENDED_GAME" );
25 #precache( "eventstring", "medal_received" );
26 #precache( "eventstring", "killstreak_received" );
27 #precache( "eventstring", "player_callout" );
28 #precache( "eventstring", "score_event" );
29 #precache( "eventstring", "rank_up" );
30 #precache( "eventstring", "gun_level_complete" );
31 #precache( "eventstring", "challenge_complete" );
32 
33 #namespace globallogic_ui;
34 
35 ‪REGISTER_SYSTEM( "globallogic_ui", &‪__init__, undefined )
36 
37 function ‪__init__()
38 {
39 }
40 
42 {
43  level.autoassign =&‪menuAutoAssign;
44  level.spectator =&‪menuSpectator;
45  level.curClass =&‪menuClass;
46  level.teamMenu =&‪menuTeam;
47 }
48 
50 {
51  // free up some hud elems so we have enough for other things.
52 
53  // perk icons
54  if ( isdefined( self.perkicon ) )
55  {
56  for ( numSpecialties = 0; numSpecialties < level.maxSpecialties; numSpecialties++ )
57  {
58  if ( isdefined( self.perkicon[ numSpecialties ] ) )
59  {
60  self.perkicon[ numSpecialties ] ‪hud::destroyElem();
61  self.perkname[ numSpecialties ] ‪hud::destroyElem();
62  }
63  }
64  }
65 
66  if ( isdefined( self.perkHudelem ) )
67  {
68  self.perkHudelem ‪hud::destroyElem();
69  }
70 
71  // Killstreak icons
72  if ( isdefined( self.killstreakicon ) )
73  {
74  if ( isdefined( self.killstreakicon[0] ) )
75  {
76  self.killstreakicon[0] ‪hud::destroyElem();
77  }
78  if ( isdefined( self.killstreakicon[1] ) )
79  {
80  self.killstreakicon[1] ‪hud::destroyElem();
81  }
82  if ( isdefined( self.killstreakicon[2] ) )
83  {
84  self.killstreakicon[2] ‪hud::destroyElem();
85  }
86  if ( isdefined( self.killstreakicon[3] ) )
87  {
88  self.killstreakicon[3] ‪hud::destroyElem();
89  }
90  if ( isdefined( self.killstreakicon[4] ) )
91  {
92  self.killstreakicon[4] ‪hud::destroyElem();
93  }
94  }
95 
96  // lower message
97  if ( isdefined( self.lowerMessage ) )
98  self.lowerMessage ‪hud::destroyElem();
99  if ( isdefined( self.lowerTimer ) )
100  self.lowerTimer ‪hud::destroyElem();
101 
102  // progress bar
103  if ( isdefined( self.proxBar ) )
104  self.proxBar ‪hud::destroyElem();
105  if ( isdefined( self.proxBarText ) )
106  self.proxBarText ‪hud::destroyElem();
107 
108  // carry icon
109  if ( isdefined( self.carryIcon ) )
110  self.carryIcon ‪hud::destroyElem();
111 
112  //_killstreaks::destroyKillstreakTimers();
113 }
114 
115 function ‪teamPlayerCountsEqual( playerCounts )
116 {
117  count = undefined;
118 
119  foreach( team in level.teams )
120  {
121  if ( !isdefined( count ) )
122  {
123  count = playerCounts[team];
124  continue;
125  }
126  if ( count != playerCounts[team] )
127  return false;
128  }
129 
130  return true;
131 }
132 
133 function ‪teamWithLowestPlayerCount( playerCounts, ignore_team )
134 {
135  count = 9999;
136  lowest_team = undefined;
137 
138  foreach( team in level.teams )
139  {
140  if ( count > playerCounts[team] )
141  {
142  count = playerCounts[team];
143  lowest_team = team;
144  }
145  }
146 
147  return lowest_team;
148 }
149 
150 function ‪menuAutoAssign( comingFromMenu )
151 {
152  teamKeys = GetArrayKeys( level.teams );
153  assignment = teamKeys[randomInt(teamKeys.size)];
154 
155  self ‪closeMenus();
156 
157  if( isdefined(level.forceAllAllies) && level.forceAllAllies )
158  {
159  assignment = "allies";
160  }
161  else if ( level.teamBased )
162  {
163  if ( GetDvarint( "party_autoteams" ) == 1 )
164  {
165  // after they have spawned in once then we should let the team balancing
166  // code below do the picking otherwise the "auto-assign" wont do anything.
167  if( level.allow_teamchange == "1" && ( self.hasSpawned || comingFromMenu ) )
168  {
169  assignment = "";
170  }
171  else
172  {
173  // TODO MTEAM changed the getAssignedTeam function to directly return a name instead of an index
174  // This entire swich statement can be removed after the next exe on 5/1/2012
175  // just use the default case:
176  team = getAssignedTeam( self );
177  switch ( team )
178  {
179  // LEGACY - Remove when new exes are checked in
180  case 1:
181  assignment = teamKeys[1];
182  break;
183 
184  // LEGACY - Remove when new exes are checked in
185  case 2:
186  assignment = teamKeys[0];
187  break;
188 
189  // LEGACY - Remove when new exes are checked in
190  case 3:
191  assignment = teamKeys[2];
192  break;
193 
194  // LEGACY - Remove when new exes are checked in
195  case 4:
196  // if they are supposed to be a spectator just set the clientscriptmainmenu and return
197  if ( !isdefined( level.forceAutoAssign ) || !level.forceAutoAssign )
198  {
199  self SetClientScriptMainMenu( game[ "menu_start_menu" ] );
200  return;
201  }
202  default:
203  {
204  assignment = "";
205  if( isdefined( level.teams[team] ) )
206  {
207  assignment = team;
208  }
209  else if ( team == "spectator" && (!level.forceAutoAssign) )
210  {
211  self SetClientScriptMainMenu( game[ "menu_start_menu" ] );
212  return;
213  }
214  }
215  }
216  }
217  }
218 
219  if ( assignment == "" || GetDvarint( "party_autoteams" ) == 0 )
220  {
221  if ( SessionModeIsZombiesGame() )
222  {
223  assignment = "allies";
224  }
225  /*else
226  {
227  playerCounts = self _teams::CountPlayers();
228 
229  // if teams are equal return the team with the lowest score
230  if ( teamPlayerCountsEqual( playerCounts ) )
231  {
232  // try to keep online splitscreen players together
233  if ( !level.splitscreen && self IsSplitScreen() )
234  {
235  assignment = self getSplitscreenTeam();
236 
237  if ( assignment == "" )
238  assignment = pickTeamFromScores(teamKeys);
239  }
240  else
241  {
242  assignment = pickTeamFromScores(teamKeys);
243  }
244  }
245  else
246  {
247  assignment = teamWithLowestPlayerCount( playerCounts, "none" );
248  }
249  }
250  */
251  }
252 
253  // matchmaking vs. bots
254  /*
255  if ( !SessionModeIsZombiesGame() && level.rankedMatch && GetDvarInt( "party_autoteams" ) == 0 )
256  {
257  host = util::getHostPlayerForBots();
258  assert( isdefined( host ) );
259 
260  if ( !isdefined( host.pers[ "team" ] ) )
261  {
262  host.pers[ "team" ] = teamKeys[randomInt(teamKeys.size)];
263  host.team = host.pers[ "team" ];
264  }
265 
266  if ( host != self )
267  {
268  assert( isdefined( host.pers[ "team" ] ) );
269 
270  if ( self util::is_bot() )
271  {
272  playerCounts = self _teams::CountPlayers();
273  assignment = teamWithLowestPlayerCount( playerCounts, host.pers[ "team" ] );
274  }
275  else
276  {
277  assignment = host.pers[ "team" ];
278  }
279  }
280  }
281  */
282 
283  if ( assignment == self.pers["team"] && (self.sessionstate == "playing" || self.sessionstate == "dead") )
284  {
285  self ‪beginClassChoice();
286  return;
287  }
288  }
289  else
290  {
291  if ( GetDvarint( "party_autoteams" ) == 1 )
292  {
293  // after they have spawned in once then we should let the random team assignment logic handle itself.
294  if( level.allow_teamchange != "1" || ( !self.hasSpawned && !comingFromMenu ) )
295  {
296  team = getAssignedTeam( self );
297  if( isdefined( level.teams[team] ) )
298  {
299  assignment = team;
300  }
301  else if ( team == "spectator" && (!level.forceAutoAssign) )
302  {
303  self SetClientScriptMainMenu( game[ "menu_start_menu" ] );
304  return;
305  }
306  }
307  }
308  }
309 
310  if ( assignment != self.pers["team"] && (self.sessionstate == "playing" || self.sessionstate == "dead") )
311  {
312  self.switching_teams = true;
313  self.joining_team = assignment;
314  self.leaving_team = self.pers["team"];
315  self ‪suicide();
316  }
317 
318  self.pers["team"] = assignment;
319  self.team = assignment;
320  self.pers["class"] = undefined;
321  self.curClass = undefined;
322  self.pers["weapon"] = undefined;
323  self.pers["savedmodel"] = undefined;
324 
325  self ‪updateObjectiveText();
326 
327  self.sessionteam = assignment;
328 
329  if ( !isAlive( self ) )
330  self.statusicon = "hud_status_dead";
331 
332  self notify("joined_team");
333  level notify( "joined_team" );
334  self ‪callback::callback( #"on_joined_team" );
335  self notify("end_respawn");
336 
337  self ‪beginClassChoice();
338  self SetClientScriptMainMenu( game[ "menu_start_menu" ] );
339 
340 }
341 
343 {
344  score = undefined;
345 
346  foreach( team in level.teams )
347  {
348  if ( !isdefined( score ) )
349  {
350  score = getTeamScore(team);
351  continue;
352  }
353  if ( score != getTeamScore(team) )
354  return false;
355  }
356 
357  return true;
358 }
359 
361 {
362  score = 99999999;
363  lowest_team = undefined;
364 
365  foreach( team in level.teams )
366  {
367  if ( score > getTeamScore(team ) )
368  lowest_team = team;
369  }
370 
371  return lowest_team;
372 }
373 
374 function ‪pickTeamFromScores(teams)
375 {
376  assignment = "allies";
377 
378  if ( ‪teamScoresEqual() )
379  assignment = teams[randomInt(teams.size)];
380  else
381  assignment = ‪teamWithLowestScore();
382 
383  return assignment;
384 }
385 
387 {
388  for ( index = 0; index < level.players.size; index++ )
389  {
390  if ( !isdefined(level.players[index]) )
391  continue;
392 
393  if ( level.players[index] == self )
394  continue;
395 
396  if ( !(self IsPlayerOnSameMachine( level.players[index] )) )
397  continue;
398 
399  team = level.players[index].sessionteam;
400 
401  // going to assume first non-spectator
402  if ( team != "spectator" )
403  return team;
404  }
405 
406  return "";
407 }
408 
410 {
411  if ( SessionModeIsZombiesGame() || (self.pers["team"] == "spectator") )
412  {
413  self SetClientCGObjectiveText( "" );
414  return;
415  }
416 
417  if( level.scorelimit > 0 )
418  {
419  self SetClientCGObjectiveText( ‪util::getObjectiveScoreText( self.pers["team"] ) );
420  }
421  else
422  {
423  self SetClientCGObjectiveText( ‪util::getObjectiveText( self.pers["team"] ) );
424  }
425 }
426 
427 
428 function ‪closeMenus()
429 {
430  self closeInGameMenu();
431 }
432 
433 function ‪beginClassChoice( forceNewChoice )
434 {
435  assert( isdefined( level.teams[self.pers["team"]] ) );
436 
437  team = self.pers["team"];
438 
439  if ( level.disableCAC == 1 )
440  {
441  // skip class choice and just spawn.
442 
443  self.pers["class"] = level.defaultClass;
444  self.curClass = level.defaultClass;
445 
446  // open a menu that just sets the ui_team localvar
447  //self openMenu( game[ "menu_initteam_" + team ] );
448 
449  if ( self.sessionstate != "playing" && game["state"] == "playing" )
450  self thread [[level.spawnClient]]();
451  level thread ‪globallogic::updateTeamStatus();
453 
454  return;
455  }
456 
457  // menu_changeclass_team is the one where you choose one of the n classes to play as.
458  // menu_class_team is where you can choose to change your team, class, controls, or leave game.
459  self openMenu( game[ "menu_changeclass_" + team ] );
460 
461  //if ( level.rankedMatch )
462  // self openMenu( game[ "menu_changeclass_" + team ] );
463  //else
464  // self openMenu( game[ "menu_start_menu" ] );
465 }
466 
468 {
469  assert( isdefined( level.teams[self.pers["team"]] ) );
470 
471  team = self.pers["team"];
472 
473  // menu_changeclass_team is the one where you choose one of the n classes to play as.
474  // menu_class_team is where you can choose to change your team, class, controls, or leave game.
475 
476  self openMenu( game[ "menu_changeclass_" + team ] );
477 }
478 
479 function ‪menuTeam( team )
480 {
481  self ‪closeMenus();
482 
483  if ( !level.console && level.allow_teamchange == "0" && (isdefined(self.hasDoneCombat) && self.hasDoneCombat) )
484  {
485  return;
486  }
487 
488  if(self.pers["team"] != team)
489  {
490  // allow respawn when switching teams during grace period.
491  if ( level.inGracePeriod && (!isdefined(self.hasDoneCombat) || !self.hasDoneCombat) )
492  self.hasSpawned = false;
493 
494  if(self.sessionstate == "playing")
495  {
496  self.switching_teams = true;
497  self.joining_team = team;
498  self.leaving_team = self.pers["team"];
499  self ‪suicide();
500  }
501 
502  self.pers["team"] = team;
503  self.team = team;
504  self.pers["class"] = undefined;
505  self.curClass = undefined;
506  self.pers["weapon"] = undefined;
507  self.pers["savedmodel"] = undefined;
508 
509  self ‪updateObjectiveText();
510 
511  self.sessionteam = team;
512 
513  self SetClientScriptMainMenu( game[ "menu_start_menu" ] );
514 
515  self notify("joined_team");
516  level notify( "joined_team" );
517  self ‪callback::callback( #"on_joined_team" );
518  self notify("end_respawn");
519  }
520 
521  self ‪beginClassChoice();
522 }
523 
525 {
526  self ‪closeMenus();
527 
528  if(self.pers["team"] != "spectator")
529  {
530  if(isAlive(self))
531  {
532  self.switching_teams = true;
533  self.joining_team = "spectator";
534  self.leaving_team = self.pers["team"];
535  self ‪suicide();
536  }
537 
538  self.pers["team"] = "spectator";
539  self.team = "spectator";
540  self.pers["class"] = undefined;
541  self.curClass = undefined;
542  self.pers["weapon"] = undefined;
543  self.pers["savedmodel"] = undefined;
544 
545  self ‪updateObjectiveText();
546 
547  self.sessionteam = "spectator";
548 
549  [[level.spawnSpectator]]();
550 
552 
553  self SetClientScriptMainMenu( game[ "menu_start_menu" ] );
554 
555  self notify("joined_spectators");
556  }
557 }
558 
559 function ‪menuClass( response )
560 {
561  self ‪closeMenus();
562 /*
563  // this should probably be an assert
564  if(!isdefined(self.pers["team"]) || !(isdefined( level.teams[self.pers["team"]] ) ) )
565  return;
566 
567  class = undefined;//self _class::getClassChoice( response );
568 
569  if( (isdefined( self.pers["class"] ) && self.pers["class"] == class) )
570  return;
571 
572  self notify ( "changed_class" );
573 // self _gametype_variants::OnPlayerClassChange();
574 
575  if ( self.sessionstate == "playing" )
576  {
577  self.pers["class"] = class;
578  self.class = class;
579  self.pers["weapon"] = undefined;
580 
581  if ( game["state"] == "postgame" )
582  return;
583 
584  supplyStationClassChange = isdefined( self.usingSupplyStation ) && self.usingSupplyStation;
585  self.usingSupplyStation = false;
586 
587  if ( ( level.inGracePeriod && !self.hasDoneCombat ) || supplyStationClassChange ) // used weapons check?
588  {
589  self _class::setClass( self.pers["class"] );
590  self.tag_stowed_back = undefined;
591  self.tag_stowed_hip = undefined;
592  self _class::giveLoadout( self.pers["team"], self.pers["class"] );
593  // self _killstreaks::giveOwnedKillstreak();
594  }
595  else if ( !level.splitScreen )
596  {
597  notifyData = spawnstruct();
598 
599  self DisplayGameModeMessage( game["strings"]["change_class"], "uin_alert_slideout" );
600  }
601  }
602  else
603  {
604  self.pers["class"] = class;
605  self.class = class;
606  self.pers["weapon"] = undefined;
607 
608  if ( game["state"] == "postgame" )
609  return;
610 
611  if ( self.sessionstate != "spectator" )
612  {
613  if ( self IsInVehicle() )
614  return;
615 
616  if ( self IsRemoteControlling() )
617  return;
618 
619  if ( self IsWeaponViewOnlyLinked() )
620  return false;
621  }
622 
623  if ( game["state"] == "playing" )
624  {
625  timePassed = undefined;
626 
627  if ( isdefined( self.respawnTimerStartTime ) )
628  {
629  timePassed = (gettime() - self.respawnTimerStartTime) / 1000;
630  }
631 
632  self thread [[level.spawnClient]](timePassed);
633 
634  self.respawnTimerStartTime = undefined;
635 
636  }
637  }
638 
639  level thread globallogic::updateTeamStatus();
640 
641  self thread spectating::setSpectatePermissionsForMachine();*/
642 }
643 
644 
645 /*
646 function showSafeSpawnMessage()
647 {
648  if ( level.splitscreen )
649  return;
650 
651  // don't show it if they've already asked for a safe spawn
652  if ( self.wantSafeSpawn )
653  return;
654 
655  if ( !isdefined( self.safeSpawnMsg ) )
656  {
657  self.safeSpawnMsg = hud::createFontString( "default", 1.4 );
658  self.safeSpawnMsg hud::setPoint( "CENTER", level.lowerTextYAlign, 0, level.lowerTextY + 50 );
659  self.safeSpawnMsg setText( &"PLATFORM_PRESS_TO_SAFESPAWN" );
660  self.safeSpawnMsg.archived = false;
661  }
662  self.safeSpawnMsg.alpha = 1;
663 }
664 function hideSafeSpawnMessage()
665 {
666  if ( !isdefined( self.safeSpawnMsg ) )
667  return;
668 
669  self.safeSpawnMsg.alpha = 0;
670 }
671 */
672 
673 
675 {
676  self endon("disconnect");
677 
678  waittillframeend; // so we don't endon the end_respawn from spawning as a spectator
679 
680  self endon("end_respawn");
681 
682  wait ‪delay;
683 
684  self ‪util::clearLowerMessage( 2.0 );
685 }
686 
‪callback
‪function callback(event, localclientnum, params)
Definition: callbacks_shared.csc:13
‪spectate_player_watcher
‪function spectate_player_watcher()
Definition: _globallogic_player.gsc:1271
‪menuSpectator
‪function menuSpectator()
Definition: _globallogic_ui.gsc:526
‪closeMenus
‪function closeMenus()
Definition: _globallogic_ui.gsc:416
‪destroyElem
‪function destroyElem()
Definition: hud_util_shared.gsc:755
‪getObjectiveScoreText
‪function getObjectiveScoreText(team)
Definition: _util.gsc:605
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪setSpectatePermissionsForMachine
‪function setSpectatePermissionsForMachine()
Definition: _spectating.gsc:211
‪suicide
‪function suicide()
Definition: _vehicle.gsc:1309
‪removeSpawnMessageShortly
‪function removeSpawnMessageShortly(delay)
Definition: _globallogic_ui.gsc:649
‪getSplitscreenTeam
‪function getSplitscreenTeam()
Definition: _globallogic_ui.gsc:386
‪updateTeamStatus
‪function updateTeamStatus()
Definition: _globallogic.gsc:2920
‪__init__
‪function __init__()
Definition: _globallogic_ui.gsc:37
‪menuAutoAssign
‪function menuAutoAssign(comingFromMenu)
Definition: _globallogic_ui.gsc:176
‪showMainMenuForTeam
‪function showMainMenuForTeam()
Definition: _globallogic_ui.gsc:461
‪SetupCallbacks
‪function SetupCallbacks()
Definition: _globallogic_ui.gsc:43
‪teamScoresEqual
‪function teamScoresEqual()
Definition: _globallogic_ui.gsc:330
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪menuClass
‪function menuClass(response, forcedClass)
Definition: _globallogic_ui.gsc:563
‪menuTeam
‪function menuTeam(team)
Definition: _globallogic_ui.gsc:473
‪freeGameplayHudElems
‪function freeGameplayHudElems()
Definition: _globallogic_ui.gsc:51
‪beginClassChoice
‪function beginClassChoice()
Definition: _globallogic_ui.gsc:421
‪teamWithLowestScore
‪function teamWithLowestScore()
Definition: _globallogic_ui.gsc:348
‪updateObjectiveText
‪function updateObjectiveText()
Definition: _globallogic_ui.gsc:397
‪teamWithLowestPlayerCount
‪function teamWithLowestPlayerCount(playerCounts, ignore_team)
Definition: _globallogic_ui.gsc:133
‪pickTeamFromScores
‪function pickTeamFromScores(teams)
Definition: _globallogic_ui.gsc:362
‪getObjectiveText
‪function getObjectiveText(team)
Definition: _util.gsc:600
‪teamPlayerCountsEqual
‪function teamPlayerCountsEqual(playerCounts)
Definition: _globallogic_ui.gsc:115
‪clearLowerMessage
‪function clearLowerMessage(fadetime)
Definition: _util.gsc:166