‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_util.gsc
Go to the documentation of this file.
1 #using scripts\shared\array_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\exploder_shared;
4 #using scripts\shared\flag_shared;
5 #using scripts\shared\lui_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\sound_shared;
8 #using scripts\shared\util_shared;
9 
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\statstable_shared.gsh;
12 
13 #namespace util;
14 
15 #define HINT_TEXT_DISPLAY_TIME_DEFAULT 4.0
16 #define N_HINT_TEXT_FADE_TIME 0.75
17 #define HINT_TEXT_DISPLAY_HEIGHT -160
18 #define HINT_TEXT_TURN_OFF_NOTIFY "notify_turn_off_hint_text"
19 
20 #precache( "lui_menu", "MPHintText" );
21 #precache( "lui_menu_data", "hint_text_line" );
22 
23 #precache( "string", "blinking");
24 #precache( "string", "display_noblink");
25 #precache( "string", "fadeout");
26 
27 /#
28 function ‪error(msg)
29 {
30  println("^c*ERROR* ", msg);
31  wait .05; // waitframe
32 
33  if (GetDvarString( "debug") != "1")
34  assertmsg("This is a forced error - attach the log file");
35 }
36 #/
37 
38 function ‪warning( msg )
39 {
40 /# println( "^1WARNING: " + msg ); #/
41 }
42 
56 function ‪within_fov( start_origin, start_angles, end_origin, fov )
57 {
58  normal = VectorNormalize( end_origin - start_origin );
59  forward = AnglesToForward( start_angles );
60  dot = VectorDot( forward, normal );
61 
62  return dot >= fov;
63 }
64 
66 {
67  return 70.0; // inches, see bg_pmove.cpp::playerMins/playerMaxs
68 }
69 
70 
71 function ‪IsBulletImpactMOD( sMeansOfDeath )
72 {
73  return IsSubStr( sMeansOfDeath, "BULLET" ) || sMeansOfDeath == "MOD_HEAD_SHOT";
74 }
75 
77 {
78  self endon("disconnect");
79  self endon("end_respawn");
80 
81  while(self useButtonPressed() != true)
82  wait .05;
83 }
84 
85 
86 function ‪setLowerMessage( text, time, combineMessageAndTimer )
87 {
88  if ( !isdefined( self.lowerMessage ) )
89  return;
90 
91  if ( isdefined( self.lowerMessageOverride ) && text != &"" )
92  {
93  text = self.lowerMessageOverride;
94  time = undefined;
95  }
96 
97  self notify("lower_message_set");
98 
99  self.lowerMessage setText( text );
100 
101  if ( isdefined( time ) && time > 0 )
102  {
103  if ( !isdefined( combineMessageAndTimer ) || !combineMessageAndTimer )
104  self.lowerTimer.label = &"";
105  else
106  {
107  self.lowerMessage setText( "" );
108  self.lowerTimer.label = text;
109  }
110  self.lowerTimer setTimer( time );
111  }
112  else
113  {
114  self.lowerTimer setText( "" );
115  self.lowerTimer.label = &"";
116  }
117  if( self IsSplitscreen() )
118  self.lowerMessage.fontscale = 1.4;
119 
120  self.lowerMessage fadeOverTime( 0.05 );
121  self.lowerMessage.alpha = 1;
122  self.lowerTimer fadeOverTime( 0.05 );
123  self.lowerTimer.alpha = 1;
124 }
125 
126 function ‪setLowerMessageValue( text, value, combineMessage )
127 {
128  if ( !isdefined( self.lowerMessage ) )
129  return;
130 
131  if ( isdefined( self.lowerMessageOverride ) && text != &"" )
132  {
133  text = self.lowerMessageOverride;
134  time = undefined;
135  }
136 
137  self notify("lower_message_set");
138  if ( !isdefined( combineMessage ) || !combineMessage )
139  self.lowerMessage setText( text );
140  else
141  self.lowerMessage setText( "" );
142 
143  if ( isdefined( value ) && value > 0 )
144  {
145  if ( !isdefined( combineMessage ) || !combineMessage )
146  self.lowerTimer.label = &"";
147  else
148  self.lowerTimer.label = text;
149  self.lowerTimer setValue( value );
150  }
151  else
152  {
153  self.lowerTimer setText( "" );
154  self.lowerTimer.label = &"";
155  }
156 
157  if( self IsSplitscreen() )
158  self.lowerMessage.fontscale = 1.4;
159 
160  self.lowerMessage fadeOverTime( 0.05 );
161  self.lowerMessage.alpha = 1;
162  self.lowerTimer fadeOverTime( 0.05 );
163  self.lowerTimer.alpha = 1;
164 }
165 
166 function ‪clearLowerMessage( fadetime )
167 {
168  if ( !isdefined( self.lowerMessage ) )
169  return;
170 
171  self notify("lower_message_set");
172 
173  if ( !isdefined( fadetime) || fadetime == 0 )
174  {
175  ‪setLowerMessage( &"" );
176  }
177  else
178  {
179  self endon("disconnect");
180  self endon("lower_message_set");
181 
182  self.lowerMessage fadeOverTime( fadetime );
183  self.lowerMessage.alpha = 0;
184  self.lowerTimer fadeOverTime( fadetime );
185  self.lowerTimer.alpha = 0;
186 
187  wait fadetime;
188 
189  self ‪setLowerMessage("");
190  }
191 }
192 
193 function ‪printOnTeam(text, team)
194 {
195  assert( isdefined( level.players ) );
196  for ( i = 0; i < level.players.size; i++ )
197  {
198  player = level.players[i];
199  if ( ( isdefined(player.pers["team"]) ) && (player.pers["team"] == team) )
200  player iprintln(text);
201  }
202 }
203 
204 
205 function ‪printBoldOnTeam(text, team)
206 {
207  assert( isdefined( level.players ) );
208  for ( i = 0; i < level.players.size; i++ )
209  {
210  player = level.players[i];
211  if ( ( isdefined(player.pers["team"]) ) && (player.pers["team"] == team) )
212  player iprintlnbold(text);
213  }
214 }
215 
216 
217 
218 function ‪printBoldOnTeamArg(text, team, arg)
219 {
220  assert( isdefined( level.players ) );
221  for ( i = 0; i < level.players.size; i++ )
222  {
223  player = level.players[i];
224  if ( ( isdefined(player.pers["team"]) ) && (player.pers["team"] == team) )
225  player iprintlnbold(text, arg);
226  }
227 }
228 
229 
230 function ‪printOnTeamArg(text, team, arg)
231 {
232 }
233 
234 
235 function ‪printOnPlayers( text, team )
236 {
237  players = level.players;
238  for(i = 0; i < players.size; i++)
239  {
240  if ( isdefined( team ) )
241  {
242  if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == team))
243  players[i] iprintln(text);
244  }
245  else
246  {
247  players[i] iprintln(text);
248  }
249  }
250 }
251 
252 function ‪printAndSoundOnEveryone( team, enemyteam, printFriendly, printEnemy, soundFriendly, soundEnemy, printarg )
253 {
254  shouldDoSounds = isdefined( soundFriendly );
255 
256  shouldDoEnemySounds = false;
257  if ( isdefined( soundEnemy ) )
258  {
259  assert( shouldDoSounds ); // can't have an enemy sound without a friendly sound
260  shouldDoEnemySounds = true;
261  }
262 
263  if ( !isdefined( printarg ) )
264  {
265  printarg = "";
266  }
267 
268  if ( level.splitscreen || !shouldDoSounds )
269  {
270  for ( i = 0; i < level.players.size; i++ )
271  {
272  player = level.players[i];
273  playerteam = player.pers["team"];
274  if ( isdefined( playerteam ) )
275  {
276  if ( playerteam == team && isdefined( printFriendly ) && printFriendly != &"" )
277  player iprintln( printFriendly, printarg );
278  else if ( isdefined( printEnemy ) && printEnemy != &"" )
279  {
280  if ( isdefined(enemyteam) && playerteam == enemyteam )
281  player iprintln( printEnemy, printarg );
282  else if ( !isdefined(enemyteam) && playerteam != team )
283  player iprintln( printEnemy, printarg );
284  }
285  }
286  }
287  if ( shouldDoSounds )
288  {
289  assert( level.splitscreen );
290  level.players[0] playLocalSound( soundFriendly );
291  }
292  }
293  else
294  {
295  assert( shouldDoSounds );
296  if ( shouldDoEnemySounds )
297  {
298  for ( i = 0; i < level.players.size; i++ )
299  {
300  player = level.players[i];
301  playerteam = player.pers["team"];
302  if ( isdefined( playerteam ) )
303  {
304  if ( playerteam == team )
305  {
306  if( isdefined( printFriendly ) && printFriendly != &"" )
307  player iprintln( printFriendly, printarg );
308  player playLocalSound( soundFriendly );
309  }
310  else if ( (isdefined(enemyteam) && playerteam == enemyteam) || ( !isdefined( enemyteam ) && playerteam != team ) )
311  {
312  if( isdefined( printEnemy ) && printEnemy != &"" )
313  player iprintln( printEnemy, printarg );
314  player playLocalSound( soundEnemy );
315  }
316  }
317  }
318  }
319  else
320  {
321  for ( i = 0; i < level.players.size; i++ )
322  {
323  player = level.players[i];
324  playerteam = player.pers["team"];
325  if ( isdefined( playerteam ) )
326  {
327  if ( playerteam == team )
328  {
329  if( isdefined( printFriendly ) && printFriendly != &"" )
330  player iprintln( printFriendly, printarg );
331  player playLocalSound( soundFriendly );
332  }
333  else if ( isdefined( printEnemy ) && printEnemy != &"" )
334  {
335  if ( isdefined(enemyteam) && playerteam == enemyteam )
336  {
337  player iprintln( printEnemy, printarg );
338  }
339  else if ( !isdefined(enemyteam) && playerteam != team )
340  {
341  player iprintln( printEnemy, printarg );
342  }
343  }
344  }
345  }
346  }
347  }
348 }
349 
350 
351 function ‪_playLocalSound( soundAlias )
352 {
353  if ( level.splitscreen && !self IsHost() )
354  return;
355 
356  self playLocalSound( soundAlias );
357 }
358 
359 // this function is depricated
360 function ‪getOtherTeam( team )
361 {
362  // TODO MTEAM - Need to fix this.
363  if ( team == "allies" )
364  return "axis";
365  else if ( team == "axis" )
366  return "allies";
367  else // all other teams
368  return "allies";
369 
370  assertMsg( "getOtherTeam: invalid team " + team );
371 }
372 
373 function ‪getTeamMask( team )
374 {
375  // this can be undefined on connect
376  if ( !level.teambased || !isdefined(team) || !isdefined(level.spawnsystem.iSPAWN_TEAMMASK[team]) )
377  return level.spawnsystem.iSPAWN_TEAMMASK_FREE;
378 
379  return level.spawnsystem.iSPAWN_TEAMMASK[team];
380 }
381 
382 function ‪getOtherTeamsMask( skip_team )
383 {
384  mask = 0;
385  foreach( team in level.teams )
386  {
387  if ( team == skip_team )
388  continue;
389 
390  mask = mask | ‪getTeamMask( team );
391  }
392 
393  return mask;
394 }
395 
396 function ‪wait_endon( waitTime, endOnString, endonString2, endonString3, endonString4 )
397 {
398  self endon ( endOnString );
399  if ( isdefined( endonString2 ) )
400  self endon ( endonString2 );
401  if ( isdefined( endonString3 ) )
402  self endon ( endonString3 );
403  if ( isdefined( endonString4 ) )
404  self endon ( endonString4 );
405 
406  wait ( waitTime );
407  return true;
408 }
409 
410 function ‪plot_points( plotpoints, r, g, b, ‪timer )
411 {
412 }
413 
414 function ‪getfx( fx )
415 {
416  assert( isdefined( level._effect[ fx ] ), "Fx " + fx + " is not defined in level._effect." );
417  return level._effect[ fx ];
418 }
419 
421  dvar,
422  value,
423  reset)
424 {
425  if (!isdefined(reset))
426  reset = false;
427 
428  if (reset || GetDvarString(dvar)=="")
429  {
430  SetDvar(dvar, value);
431  return value;
432  }
433 
434  return GetDvarString(dvar);
435 }
436 
438  dvar,
439  value,
440  reset)
441 {
442  if (!isdefined(reset))
443  reset = false;
444 
445  if (reset || GetDvarString(dvar)=="")
446  {
447  SetDvar(dvar, value);
448  }
449 
450  return GetDvarFloat(dvar);
451 }
452 
454  dvar,
455  value,
456  reset)
457 {
458  if (!isdefined(reset))
459  reset = false;
460 
461  if (reset || GetDvarString(dvar)=="")
462  {
463  SetDvar(dvar, value);
464  return int(value);
465  }
466 
467  return GetDvarInt(dvar);
468 }
469 
470 function ‪add_trigger_to_ent(ent) // Self == The trigger volume
471 {
472  if(!isdefined(ent._triggers))
473  {
474  ent._triggers = [];
475  }
476 
477  ent._triggers[self GetEntityNumber()] = 1;
478 }
479 
480 function ‪remove_trigger_from_ent(ent) // Self == The trigger volume.
481 {
482  if(!isdefined(ent))
483  return;
484 
485  if(!isdefined(ent._triggers))
486  return;
487 
488  if(!isdefined(ent._triggers[self GetEntityNumber()]))
489  return;
490 
491  ent._triggers[self GetEntityNumber()] = 0;
492 }
493 
494 function ‪ent_already_in_trigger(trig) // Self == The entity in the trigger volume.
495 {
496  if(!isdefined(self._triggers))
497  return false;
498 
499  if(!isdefined(self._triggers[trig GetEntityNumber()]))
500  return false;
501 
502  if(!self._triggers[trig GetEntityNumber()])
503  return false;
504 
505  return true; // We're already in this trigger volume.
506 }
507 
509 {
510  ent waittill("death");
511  self endon(ender);
512  self ‪remove_trigger_from_ent(ent);
513 }
514 
515 function ‪trigger_thread(ent, on_enter_payload, on_exit_payload) // Self == The trigger.
516 {
517  ent endon("entityshutdown");
518  ent endon("death");
519 
520  if(ent ‪ent_already_in_trigger(self))
521  return;
522 
523  self ‪add_trigger_to_ent(ent);
524 
525  ender = "end_trig_death_monitor" + self GetEntityNumber() + " " + ent GetEntityNumber();
526  self thread ‪trigger_thread_death_monitor(ent, ender); // If ent dies in trigger, clear trigger off of ent.
527 
528 // iprintlnbold("Trigger " + self.targetname + " hit by ent " + ent getentitynumber());
529 
530  endon_condition = "leave_trigger_" + self GetEntityNumber();
531 
532  if(isdefined(on_enter_payload))
533  {
534  self thread [[on_enter_payload]](ent, endon_condition);
535  }
536 
537  while(isdefined(ent) && ent IsTouching(self))
538  {
539  wait(0.01);
540  }
541 
542  ent notify(endon_condition);
543 
544 // iprintlnbold(ent getentitynumber() + " leaves trigger " + self.targetname + ".");
545 
546  if(isdefined(ent) && isdefined(on_exit_payload))
547  {
548  self thread [[on_exit_payload]](ent);
549  }
550 
551  if(isdefined(ent))
552  {
553  self ‪remove_trigger_from_ent(ent);
554  }
555 
556  self notify(ender); // Get rid of the death monitor thread.
557 }
558 
559 function ‪isStrStart( string1, subStr )
560 {
561  return ( getSubStr( string1, 0, subStr.size ) == subStr );
562 }
563 
565 {
566  return isdefined( level.killstreaksenabled ) && level.killstreaksenabled;
567 }
568 
570 {
571  if ( isdefined( self.carryIcon) )
572  self.carryIcon.alpha = 0;
573 
574  assert( !self ‪isUsingRemote() );
575  self.usingRemote = remoteName;
576 
578  self.killstreak_delay_killcam = remoteName; // this is the only place we set directly, do not use killstreaks::set_killstreak_delay_killcam() here
579 
580  self disableOffhandWeapons();
581  self ‪clientfield::set_player_uimodel( "hudItems.remoteKillstreakActivated", 1 );
582  self notify( "using_remote" );
583 }
584 
585 function ‪setObjectiveText( team, text )
586 {
587  game["strings"]["objective_"+team] = text;
588 }
589 
590 function ‪setObjectiveScoreText( team, text )
591 {
592  game["strings"]["objective_score_"+team] = text;
593 }
594 
595 function ‪setObjectiveHintText( team, text )
596 {
597  game["strings"]["objective_hint_"+team] = text;
598 }
599 
600 function ‪getObjectiveText( team )
601 {
602  return game["strings"]["objective_"+team];
603 }
604 
605 function ‪getObjectiveScoreText( team )
606 {
607  return game["strings"]["objective_score_"+team];
608 }
609 
610 function ‪getObjectiveHintText( team )
611 {
612  return game["strings"]["objective_hint_"+team];
613 }
614 
615 function ‪registerRoundSwitch( minValue, maxValue )
616 {
617  level.roundSwitch = ‪math::clamp( GetGametypeSetting( "roundSwitch" ), minValue, maxValue );
618  level.roundSwitchMin = minValue;
619  level.roundSwitchMax = maxValue;
620 }
621 
622 function ‪registerRoundLimit( minValue, maxValue )
623 {
624  level.roundLimit = ‪math::clamp( GetGametypeSetting( "roundLimit" ), minValue, maxValue );
625  level.roundLimitMin = minValue;
626  level.roundLimitMax = maxValue;
627 }
628 
629 
630 function ‪registerRoundWinLimit( minValue, maxValue )
631 {
632  level.roundWinLimit = ‪math::clamp( GetGametypeSetting( "roundWinLimit" ), minValue, maxValue );
633  level.roundWinLimitMin = minValue;
634  level.roundWinLimitMax = maxValue;
635 }
636 
637 
638 function ‪registerScoreLimit( minValue, maxValue )
639 {
640  level.scoreLimit = ‪math::clamp( GetGametypeSetting( "scoreLimit" ), minValue, maxValue );
641  level.scoreLimitMin = minValue;
642  level.scoreLimitMax = maxValue;
643  SetDvar( "ui_scorelimit", level.scoreLimit );
644 }
645 
646 
647 function ‪registerRoundScoreLimit( minValue, maxValue )
648 {
649  level.roundScoreLimit = ‪math::clamp( GetGametypeSetting( "roundScoreLimit" ), minValue, maxValue );
650  level.roundScoreLimitMin = minValue;
651  level.roundScoreLimitMax = maxValue;
652 }
653 
654 
655 function ‪registerTimeLimit( minValue, maxValue )
656 {
657  level.timeLimit = ‪math::clamp( GetGametypeSetting( "timeLimit" ), minValue, maxValue );
658  level.timeLimitMin = minValue;
659  level.timeLimitMax = maxValue;
660  SetDvar( "ui_timelimit", level.timeLimit );
661 }
662 
663 
664 function ‪registerNumLives( minValue, maxValue, teamLivesMinValue, teamLivesMaxValue )
665 {
666  ‪DEFAULT( teamLivesMinValue, minValue );
667  ‪DEFAULT( teamLivesMaxValue, maxValue );
668 
669 
670  level.numLives = ‪math::clamp( GetGametypeSetting( "playerNumLives" ), minValue, maxValue );
671  level.numLivesMin = minValue;
672  level.numLivesMax = maxValue;
673  level.numTeamLives = ‪math::clamp( GetGametypeSetting( "teamNumLives" ), teamLivesMinValue, teamLivesMaxValue );
674  level.numTeamLivesMin = teamLivesMinValue;
675  level.numTeamLivesMax = teamLivesMaxValue;
676 }
677 
678 function ‪getPlayerFromClientNum( clientNum )
679 {
680  if ( clientNum < 0 )
681  return undefined;
682 
683  for ( i = 0; i < level.players.size; i++ )
684  {
685  if ( level.players[i] getEntityNumber() == clientNum )
686  return level.players[i];
687  }
688  return undefined;
689 }
690 
691 function ‪isPressBuild()
692 {
693  buildType = GetDvarString( "buildType" );
694 
695  if ( isdefined( buildType ) && buildtype == "press" )
696  {
697  return true;
698  }
699 
700  return false;
701 }
702 
704 {
705  return isdefined( self.flashEndTime ) && gettime() < self.flashEndTime;
706 }
707 
708 function ‪DoMaxDamage( origin, attacker, inflictor, headshot, mod ) // self == entity to damage
709 {
710  if ( isdefined( self.damagedToDeath ) && self.damagedToDeath )
711  {
712  return;
713  }
714 
715  if ( isdefined( self.maxHealth ) )
716  {
717  ‪damage = self.maxHealth + 1;
718  }
719  else
720  {
721  ‪damage = self.health + 1;
722  }
723 
724  self.damagedToDeath = true;
725 
726  self DoDamage( ‪damage, origin, attacker, inflictor, headshot, mod );
727 }
728 
729 
739 function ‪self_delete()
740 {
741  if ( isdefined( self ) )
742  {
743  self delete();
744  }
745 }
746 
747 
762 function ‪screen_message_create( string_message_1, string_message_2, string_message_3, n_offset_y, n_time )
763 {
764  level notify( "screen_message_create" );
765  level endon( "screen_message_create" );
766 
767  // if the mission is failing then do no create this instruction
768  // because it can potentially overlap the death/hint string
769  if( isdefined( level.missionfailed ) && level.missionfailed )
770  return;
771 
772  // if player is killed then this dvar will be set.
773  // SUMEET_TODO - make it efficient next game instead of checking dvar here
774  if( GetDvarInt( "hud_missionFailed" ) == 1 )
775  return;
776 
777  if ( !isdefined( n_offset_y ) )
778  {
779  n_offset_y = 0;
780  }
781 
782  //handle displaying the first string
783  if( !isdefined(level._screen_message_1) )
784  {
785  //text element that displays the name of the event
786  level._screen_message_1 = NewHudElem();
787  level._screen_message_1.elemType = "font";
788  level._screen_message_1.font = "objective";
789  level._screen_message_1.fontscale = 1.8;
790  level._screen_message_1.horzAlign = "center";
791  level._screen_message_1.vertAlign = "middle";
792  level._screen_message_1.alignX = "center";
793  level._screen_message_1.alignY = "middle";
794  level._screen_message_1.y = -60 + n_offset_y;
795  level._screen_message_1.sort = 2;
796 
797  level._screen_message_1.color = ( 1, 1, 1 );
798  level._screen_message_1.alpha = 1;
799 
800  level._screen_message_1.hidewheninmenu = true;
801  }
802 
803  //set the text of the element to the string passed in
804  level._screen_message_1 SetText( string_message_1 );
805 
806  if( isdefined(string_message_2) )
807  {
808  //handle displaying the first string
809  if( !isdefined(level._screen_message_2) )
810  {
811  //text element that displays the name of the event
812  level._screen_message_2 = NewHudElem();
813  level._screen_message_2.elemType = "font";
814  level._screen_message_2.font = "objective";
815  level._screen_message_2.fontscale = 1.8;
816  level._screen_message_2.horzAlign = "center";
817  level._screen_message_2.vertAlign = "middle";
818  level._screen_message_2.alignX = "center";
819  level._screen_message_2.alignY = "middle";
820  level._screen_message_2.y = -33 + n_offset_y;
821  level._screen_message_2.sort = 2;
822 
823  level._screen_message_2.color = ( 1, 1, 1 );
824  level._screen_message_2.alpha = 1;
825 
826  level._screen_message_2.hidewheninmenu = true;
827  }
828 
829  //set the text of the element to the string passed in
830  level._screen_message_2 SetText( string_message_2 );
831  }
832  else if( isdefined(level._screen_message_2) )
833  {
834  level._screen_message_2 Destroy();
835  }
836 
837  if( isdefined(string_message_3) )
838  {
839  //handle displaying the first string
840  if( !isdefined(level._screen_message_3) )
841  {
842  //text element that displays the name of the event
843  level._screen_message_3 = NewHudElem();
844  level._screen_message_3.elemType = "font";
845  level._screen_message_3.font = "objective";
846  level._screen_message_3.fontscale = 1.8;
847  level._screen_message_3.horzAlign = "center";
848  level._screen_message_3.vertAlign = "middle";
849  level._screen_message_3.alignX = "center";
850  level._screen_message_3.alignY = "middle";
851  level._screen_message_3.y = -6 + n_offset_y;
852  level._screen_message_3.sort = 2;
853 
854  level._screen_message_3.color = ( 1, 1, 1 );
855  level._screen_message_3.alpha = 1;
856 
857  level._screen_message_3.hidewheninmenu = true;
858  }
859 
860  //set the text of the element to the string passed in
861  level._screen_message_3 SetText( string_message_3 );
862  }
863  else if( isdefined(level._screen_message_3) )
864  {
865  level._screen_message_3 Destroy();
866  }
867 
868  if ( isdefined( n_time ) && n_time > 0 )
869  {
870  wait( n_time );
871 
873  }
874 }
875 
886 {
887  if( isdefined( ‪delay ) )
888  {
889  wait( ‪delay );
890  }
891 
892  if( isdefined(level._screen_message_1) )
893  {
894  level._screen_message_1 Destroy();
895  }
896  if( isdefined(level._screen_message_2) )
897  {
898  level._screen_message_2 Destroy();
899  }
900  if( isdefined(level._screen_message_3) )
901  {
902  level._screen_message_3 Destroy();
903  }
904 }
905 
916 function ‪ghost_wait_show( wait_time = 0.1 )
917 {
918  self endon( "death" );
919 
920  self Ghost();
921  wait wait_time;
922  self Show();
923 }
924 
937 function ‪ghost_wait_show_to_player( player, wait_time = 0.1, self_endon_string1 )
938 {
939  if ( !isdefined( self ) )
940  return;
941 
942  self endon( "death" );
943  self.abort_ghost_wait_show_to_player = undefined;
944 
945  if ( isdefined( player ) )
946  {
947  player endon( "death" );
948  player endon( "disconnect" );
949  player endon( "joined_team" );
950  player endon( "joined_spectators" );
951  }
952 
953  if ( isdefined( self_endon_string1 ) )
954  self endon( self_endon_string1 );
955 
956  self Ghost();
957  self SetInvisibleToAll();
958  self SetVisibleToPlayer( player );
959  wait wait_time;
960 
961  if ( !isdefined( self.abort_ghost_wait_show_to_player ) )
962  self ShowToPlayer( player );
963 }
964 
977 function ‪ghost_wait_show_to_others( player, wait_time = 0.1, self_endon_string1 )
978 {
979  if ( !isdefined( self ) )
980  return;
981 
982  self endon( "death" );
983  self.abort_ghost_wait_show_to_others = undefined;
984 
985  if ( isdefined( player ) )
986  {
987  player endon( "death" );
988  player endon( "disconnect" );
989  player endon( "joined_team" );
990  player endon( "joined_spectators" );
991  }
992 
993  if ( isdefined( self_endon_string1 ) )
994  self endon( self_endon_string1 );
995 
996  self Ghost();
997  self SetInvisibleToPlayer( player );
998  wait wait_time;
999 
1000  if ( !isdefined( self.abort_ghost_wait_show_to_others ) )
1001  {
1002  self Show();
1003  self SetInvisibleToPlayer( player );
1004  }
1005 }
1006 
1007 // button pressed wrappers
1009 {
1010  Assert( IsPlayer( self ), "Must call use_button_pressed() on a player." );
1011  return ( self UseButtonPressed() );
1012 }
1013 
1014 
1025 {
1026  while ( !self ‪use_button_pressed() )
1027  {
1028  wait .05;
1029  }
1030 }
1031 
1042 function ‪show_hint_text(str_text_to_show, b_should_blink=false, str_turn_off_notify=‪HINT_TEXT_TURN_OFF_NOTIFY, n_display_time=‪HINT_TEXT_DISPLAY_TIME_DEFAULT)
1043 {
1044  self endon (‪HINT_TEXT_TURN_OFF_NOTIFY);
1045  self endon( "hint_text_removed" );
1046 
1047  // Hide any help text which might already be up.
1048  if ( isdefined(self.hint_menu_handle) )
1049  {
1050  ‪hide_hint_text(false);
1051  }
1052 
1053  // Show the help text as a LUI menu.
1054  self.hint_menu_handle = self OpenLUIMenu( "MPHintText" );
1055  self SetLUIMenuData( self.hint_menu_handle, "hint_text_line", str_text_to_show );
1056 
1057  // Play the blink anim inside the LUImenu if it's meant to flash
1058  if (b_should_blink)
1059  {
1060  ‪lui::play_animation(self.hint_menu_handle, "blinking");
1061  }
1062  else
1063  {
1064  ‪lui::play_animation(self.hint_menu_handle, "display_noblink");
1065  }
1066 
1067  if( n_display_time != -1 )
1068  {
1069  // Listen for hide or death notify. This interrupts the normal wait timer.
1070  // This thread will also ensure the LUImenu is closed when the text has been displayed for the intended amount of time.
1071  self thread ‪hide_hint_text_listener(n_display_time);
1072 
1073  // Fade the hint text out after specified time if not interrupted.
1074  // Note: the above thread will close the LUImenu when the desired time has elapsed.
1075  self thread ‪fade_hint_text_after_time(n_display_time, str_turn_off_notify);
1076  }
1077 }
1078 
1084 function ‪hide_hint_text(b_fade_before_hiding=true)
1085 {
1086  self endon( "hint_text_removed" );
1087 
1088  if ( isdefined(self.hint_menu_handle) )
1089  {
1090  if (b_fade_before_hiding)
1091  {
1092  ‪lui::play_animation(self.hint_menu_handle, "fadeout");
1093  ‪util::waittill_any_timeout(‪N_HINT_TEXT_FADE_TIME, "kill_hint_text", "death", "hint_text_removed" );
1094  }
1095 
1096  self CloseLUIMenu(self.hint_menu_handle);
1097  self.hint_menu_handle = undefined;
1098  }
1099 
1100  // Terminate hint text threads listening for remove help text notify.
1101  self notify("hint_text_removed");
1102 }
1103 
1104 // Fade out hint text before its luimenu is destroyed.
1105 // If a notify to hide hint text is passed, this will fade out the hint text as well.
1106 function ‪fade_hint_text_after_time(n_display_time, str_turn_off_notify)
1107 {
1108  self endon( "hint_text_removed" );
1109  self endon( "death" );
1110  self endon( "kill_hint_text" );
1111 
1112  ‪util::waittill_any_timeout(n_display_time - ‪N_HINT_TEXT_FADE_TIME, str_turn_off_notify, "hint_text_removed", "kill_hint_text" );
1113 
1114  ‪hide_hint_text(true);
1115 }
1116 
1117 // Listens for a notify to turn off the help text.
1119 {
1120  // Stop listening for turn off on death or when the hint text has been removed:
1121  self endon( "hint_text_removed" );
1122  self endon( "disconnect" );
1123 
1124  ‪util::waittill_any_timeout(n_time, "kill_hint_text", "death", "hint_text_removed", "disconnect" );
1125 
1126  ‪hide_hint_text(false);
1127 }
1128 
1129 function ‪set_team_radar( team, value )
1130 {
1131  if( team == "allies" )
1132  {
1133  SetMatchFlag( "radar_allies", value );
1134  }
1135  else if ( team == "axis" )
1136  {
1137  SetMatchFlag( "radar_axis", value );
1138  }
1139 }
1140 
1142 {
1143  if ( !isdefined( level.player_contract_events ) )
1144  level.player_contract_events = [];
1145 }
1146 
1147 function ‪register_player_contract_event( event_name, event_func, max_param_count = 0 )
1148 {
1149  if ( !isdefined( level.player_contract_events[event_name] ) )
1150  {
1151  level.player_contract_events[event_name] = SpawnStruct();
1152  level.player_contract_events[event_name].param_count = max_param_count;
1153  level.player_contract_events[event_name].events = [];
1154  }
1155 
1156  assert( max_param_count == level.player_contract_events[event_name].param_count );
1157 
1158  level.player_contract_events[event_name].events[ level.player_contract_events[event_name].events.size ] = event_func;
1159 }
1160 
1161 function ‪player_contract_event( event_name, param1 = undefined, param2 = undefined, param3 = undefined )
1162 {
1163  if ( !isdefined( level.player_contract_events[event_name] ) )
1164  return;
1165 
1166  param_count = ‪VAL( level.player_contract_events[event_name].param_count, 0 );
1167 
1168  switch ( param_count )
1169  {
1170  default:
1171  case 0:
1172  foreach( event_func in level.player_contract_events[event_name].events )
1173  {
1174  if ( isdefined( event_func ) )
1175  self [[ event_func ]]();
1176  }
1177  break;
1178 
1179  case 1:
1180  foreach( event_func in level.player_contract_events[event_name].events )
1181  {
1182  if ( isdefined( event_func ) )
1183  self [[ event_func ]]( param1 );
1184  }
1185  break;
1186 
1187  case 2:
1188  foreach( event_func in level.player_contract_events[event_name].events )
1189  {
1190  if ( isdefined( event_func ) )
1191  self [[ event_func ]]( param1, param2 );
1192  }
1193  break;
1194 
1195  case 3:
1196  foreach( event_func in level.player_contract_events[event_name].events )
1197  {
1198  if ( isdefined( event_func ) )
1199  self [[ event_func ]]( param1, param2, param3 );
1200  }
1201  break;
1202  }
1203 }
1204 
1205 function ‪is_objective_game( game_type )
1206 {
1207  switch ( game_type )
1208  {
1209  case "tdm":
1210  case "dm": // ffa
1211  case "gun":
1212  case "conf":
1213  return false;
1214  break;
1215 
1216  default:
1217  return true;
1218  }
1219 }
1220 
1221 
1222 
‪fade_hint_text_after_time
‪function fade_hint_text_after_time(n_display_time, str_turn_off_notify)
Definition: _util.gsc:1106
‪IsBulletImpactMOD
‪function IsBulletImpactMOD(sMeansOfDeath)
Definition: _util.gsc:71
‪isPressBuild
‪function isPressBuild()
Definition: _util.gsc:691
‪setObjectiveText
‪function setObjectiveText(team, text)
Definition: _util.gsc:585
‪DoMaxDamage
‪function DoMaxDamage(origin, attacker, inflictor, headshot, mod)
Definition: _util.gsc:708
‪getTeamMask
‪function getTeamMask(team)
Definition: _util.gsc:373
‪printBoldOnTeamArg
‪function printBoldOnTeamArg(text, team, arg)
Definition: _util.gsc:218
‪registerRoundWinLimit
‪function registerRoundWinLimit(minValue, maxValue)
Definition: _util.gsc:630
‪timer
‪function timer(n_time, str_endon, x, y, height)
Definition: lui_shared.gsc:163
‪set_team_radar
‪function set_team_radar(team, value)
Definition: _util.gsc:1129
‪warning
‪function warning(msg)
Definition: _util.gsc:38
‪add_trigger_to_ent
‪function add_trigger_to_ent(ent)
Definition: _util.gsc:470
‪player_contract_event
‪function player_contract_event(event_name, param1=undefined, param2=undefined, param3=undefined)
Definition: _util.gsc:1161
‪set_dvar_int_if_unset
‪function set_dvar_int_if_unset(dvar, value, reset)
Definition: _util.gsc:453
‪remove_trigger_from_ent
‪function remove_trigger_from_ent(ent)
Definition: _util.gsc:480
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪HINT_TEXT_TURN_OFF_NOTIFY
‪#define HINT_TEXT_TURN_OFF_NOTIFY
Definition: _util.gsc:18
‪trigger_thread
‪function trigger_thread(ent, on_enter_payload, on_exit_payload)
Definition: _util.gsc:515
‪within_fov
‪function within_fov(start_origin, start_angles, end_origin, fov)
Definition: _util.gsc:56
‪getObjectiveScoreText
‪function getObjectiveScoreText(team)
Definition: _util.gsc:605
‪self_delete
‪function self_delete()
Definition: _util.gsc:739
‪waittill_any_timeout
‪function waittill_any_timeout(n_timeout, string1, string2, string3, string4, string5)
Definition: util_shared.csc:423
‪registerNumLives
‪function registerNumLives(minValue, maxValue, teamLivesMinValue, teamLivesMaxValue)
Definition: _util.gsc:664
‪registerScoreLimit
‪function registerScoreLimit(minValue, maxValue)
Definition: _util.gsc:638
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪use_button_pressed
‪function use_button_pressed()
Definition: _util.gsc:1008
‪play_animation
‪function play_animation(menu, str_anim)
Definition: lui_shared.gsc:93
‪error
‪function error(msg)
Definition: _util.gsc:28
‪getOtherTeam
‪function getOtherTeam(team)
Definition: _util.gsc:360
‪isUsingRemote
‪function isUsingRemote()
Definition: util_shared.gsc:2705
‪printOnTeamArg
‪function printOnTeamArg(text, team, arg)
Definition: _util.gsc:230
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪set_killstreak_delay_killcam
‪function set_killstreak_delay_killcam(killstreak_name)
Definition: _killstreaks.gsc:2446
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪screen_message_create
‪function screen_message_create(string_message_1, string_message_2, string_message_3, n_offset_y, n_time)
Definition: _util.gsc:762
‪printAndSoundOnEveryone
‪function printAndSoundOnEveryone(team, enemyteam, printFriendly, printEnemy, soundFriendly, soundEnemy, printarg)
Definition: _util.gsc:252
‪isKillStreaksEnabled
‪function isKillStreaksEnabled()
Definition: _util.gsc:564
‪init_player_contract_events
‪function init_player_contract_events()
Definition: _util.gsc:1141
‪show_hint_text
‪function show_hint_text(str_text_to_show, b_should_blink=false, str_turn_off_notify=HINT_TEXT_TURN_OFF_NOTIFY, n_display_time=HINT_TEXT_DISPLAY_TIME_DEFAULT)
Definition: _util.gsc:1042
‪setUsingRemote
‪function setUsingRemote(remoteName, set_killstreak_delay_killcam=true)
Definition: _util.gsc:569
‪_playLocalSound
‪function _playLocalSound(soundAlias)
Definition: _util.gsc:351
‪N_HINT_TEXT_FADE_TIME
‪#define N_HINT_TEXT_FADE_TIME
Definition: _util.gsc:16
‪ghost_wait_show
‪function ghost_wait_show(wait_time=0.1)
Definition: _util.gsc:916
‪setObjectiveHintText
‪function setObjectiveHintText(team, text)
Definition: _util.gsc:595
‪set_dvar_float_if_unset
‪function set_dvar_float_if_unset(dvar, value, reset)
Definition: _util.gsc:437
‪ghost_wait_show_to_player
‪function ghost_wait_show_to_player(player, wait_time=0.1, self_endon_string1)
Definition: _util.gsc:937
‪printOnPlayers
‪function printOnPlayers(text, team)
Definition: _util.gsc:235
‪plot_points
‪function plot_points(plotpoints, r, g, b, timer)
Definition: _util.gsc:410
‪waitRespawnButton
‪function waitRespawnButton()
Definition: _util.gsc:76
‪waittill_use_button_pressed
‪function waittill_use_button_pressed()
Definition: _util.gsc:1024
‪get_player_height
‪function get_player_height()
Definition: _util.gsc:65
‪printBoldOnTeam
‪function printBoldOnTeam(text, team)
Definition: _util.gsc:205
‪registerRoundSwitch
‪function registerRoundSwitch(minValue, maxValue)
Definition: _util.gsc:615
‪registerRoundLimit
‪function registerRoundLimit(minValue, maxValue)
Definition: _util.gsc:622
‪getObjectiveHintText
‪function getObjectiveHintText(team)
Definition: _util.gsc:610
‪getOtherTeamsMask
‪function getOtherTeamsMask(skip_team)
Definition: _util.gsc:382
‪is_objective_game
‪function is_objective_game(game_type)
Definition: _util.gsc:1205
‪screen_message_delete
‪function screen_message_delete(delay)
Definition: _util.gsc:885
‪isStrStart
‪function isStrStart(string1, subStr)
Definition: _util.gsc:559
‪printOnTeam
‪function printOnTeam(text, team)
Definition: _util.gsc:193
‪getPlayerFromClientNum
‪function getPlayerFromClientNum(clientNum)
Definition: _util.gsc:678
‪trigger_thread_death_monitor
‪function trigger_thread_death_monitor(ent, ender)
Definition: _util.gsc:508
‪setObjectiveScoreText
‪function setObjectiveScoreText(team, text)
Definition: _util.gsc:590
‪hide_hint_text
‪function hide_hint_text(b_fade_before_hiding=true)
Definition: _util.gsc:1084
‪setLowerMessageValue
‪function setLowerMessageValue(text, value, combineMessage)
Definition: _util.gsc:126
‪set_dvar_if_unset
‪function set_dvar_if_unset(dvar, value, reset)
Definition: _util.gsc:420
‪set_player_uimodel
‪function set_player_uimodel(str_field_name, n_value)
Definition: clientfield_shared.gsc:75
‪register_player_contract_event
‪function register_player_contract_event(event_name, event_func, max_param_count=0)
Definition: _util.gsc:1147
‪ent_already_in_trigger
‪function ent_already_in_trigger(trig)
Definition: _util.gsc:494
‪clamp
‪function clamp(val, val_min, val_max)
Definition: math_shared.csc:16
‪setLowerMessage
‪function setLowerMessage(text, time, combineMessageAndTimer)
Definition: _util.gsc:86
‪getfx
‪function getfx(fx)
Definition: _util.gsc:414
‪registerTimeLimit
‪function registerTimeLimit(minValue, maxValue)
Definition: _util.gsc:655
‪getObjectiveText
‪function getObjectiveText(team)
Definition: _util.gsc:600
‪isFlashbanged
‪function isFlashbanged()
Definition: _util.gsc:703
‪hide_hint_text_listener
‪function hide_hint_text_listener(n_time)
Definition: _util.gsc:1118
‪HINT_TEXT_DISPLAY_TIME_DEFAULT
‪#define HINT_TEXT_DISPLAY_TIME_DEFAULT
Definition: _util.gsc:15
‪wait_endon
‪function wait_endon(waitTime, endOnString, endonString2, endonString3, endonString4)
Definition: _util.gsc:396
‪ghost_wait_show_to_others
‪function ghost_wait_show_to_others(player, wait_time=0.1, self_endon_string1)
Definition: _util.gsc:977
‪registerRoundScoreLimit
‪function registerRoundScoreLimit(minValue, maxValue)
Definition: _util.gsc:647
‪clearLowerMessage
‪function clearLowerMessage(fadetime)
Definition: _util.gsc:166