‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
lui_shared.csc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\_character_customization;
4 #using scripts\shared\array_shared;
5 #using scripts\shared\callbacks_shared;
6 #using scripts\shared\system_shared;
7 #using scripts\shared\util_shared;
8 
9 #using scripts\core\_multi_extracam;
10 
11 #insert scripts\shared\shared.gsh;
12 
13 #namespace lui;
14 
15 ‪REGISTER_SYSTEM( "lui_shared", &‪__init__, undefined )
16 
17 function ‪__init__()
18 {
19  level.client_menus = associativeArray();
21 }
22 
23 function ‪on_player_connect( localClientNum )
24 {
25  level thread ‪client_menus( localClientNum );
26 }
27 
28 function ‪initMenuData( localClientNum )
29 {
30  assert( !isdefined( level.client_menus[localClientNum] ) );
31  level.client_menus[localClientNum] = associativeArray();
32 }
33 
34 function ‪createExtraCamXCamData( menu_name, localClientNum, extracam_index, target_name, xcam, sub_xcam, xcam_frame )
35 {
36  assert( isdefined( level.client_menus[localClientNum][menu_name] ) );
37  menu_data = level.client_menus[localClientNum][menu_name];
38 
39  extracam_data = SpawnStruct();
40  extracam_data.extracam_index = extracam_index;
41  extracam_data.target_name = target_name;
42  extracam_data.xcam = xcam;
43  extracam_data.sub_xcam = sub_xcam;
44  extracam_data.xcam_frame = xcam_frame;
45 
46  ‪ARRAY_ADD( menu_data.extra_cams, extracam_data );
47 }
48 
49 function ‪createCustomExtraCamXCamData( menu_name, localClientNum, extracam_index, camera_function )
50 {
51  assert( isdefined( level.client_menus[localClientNum][menu_name] ) );
52  menu_data = level.client_menus[localClientNum][menu_name];
53 
54  extracam_data = SpawnStruct();
55  extracam_data.extracam_index = extracam_index;
56  extracam_data.camera_function = camera_function;
57 
58  ‪ARRAY_ADD( menu_data.extra_cams, extracam_data );
59 }
60 
61 function ‪addMenuExploders( menu_name, localClientNum, ‪exploder )
62 {
63  assert( isdefined( level.client_menus[localClientNum][menu_name] ) );
64  menu_data = level.client_menus[localClientNum][menu_name];
65 
66  if ( IsArray( ‪exploder ) )
67  {
68  foreach ( expl in ‪exploder )
69  {
70  ‪ARRAY_ADD( menu_data.exploders, expl );
71  }
72  }
73  else
74  {
75  ‪ARRAY_ADD( menu_data.exploders, ‪exploder );
76  }
77 }
78 
79 #using_animtree( "all_player" );
80 function ‪linkToCustomCharacter( menu_name, localClientNum, target_name )
81 {
82  assert( isdefined( level.client_menus[localClientNum][menu_name] ) );
83  menu_data = level.client_menus[localClientNum][menu_name];
84  assert( !isdefined( menu_data.custom_character ) );
85 
86  model = GetEnt( localClientNum, target_name, "targetname" );
87  if ( !isdefined( model ) )
88  {
89  model = ‪util::spawn_model( localClientNum, "tag_origin" );
90  model.targetname = target_name;
91  }
92  model UseAnimTree( #animtree );
93 
94  menu_data.custom_character = ‪character_customization::create_character_data_struct( model, localClientNum );
95  model Hide();
96 }
97 
98 function ‪getCharacterDataForMenu( menu_name, localClientNum )
99 {
100  if ( isdefined( level.client_menus[localClientNum][menu_name] ) )
101  {
102  return level.client_menus[localClientNum][menu_name].custom_character;
103  }
104 
105  return undefined;
106 }
107 
108 function ‪createCameraMenu( menu_name, localClientNum, target_name, xcam, sub_xcam, xcam_frame = undefined, custom_open_fn = undefined, custom_close_fn = undefined )
109 {
110  assert( !isdefined( level.client_menus[localClientNum][menu_name] ) );
111  level.client_menus[localClientNum][menu_name] = SpawnStruct();
112  menu_data = level.client_menus[localClientNum][menu_name];
113 
114  menu_data.target_name = target_name;
115  menu_data.xcam = xcam;
116  menu_data.sub_xcam = sub_xcam;
117  menu_data.xcam_frame = xcam_frame;
118  menu_data.custom_open_fn = custom_open_fn;
119  menu_data.custom_close_fn = custom_close_fn;
120 
121  return menu_data;
122 }
123 
124 function ‪createCustomCameraMenu( menu_name, localClientNum, camera_function, has_state, custom_open_fn = undefined, custom_close_fn = undefined )
125 {
126  assert( !isdefined( level.client_menus[localClientNum][menu_name] ) );
127  level.client_menus[localClientNum][menu_name] = SpawnStruct();
128  menu_data = level.client_menus[localClientNum][menu_name];
129 
130  menu_data.camera_function = camera_function;
131  menu_data.has_state = has_state;
132  menu_data.custom_open_fn = custom_open_fn;
133  menu_data.custom_close_fn = custom_close_fn;
134 
135  return menu_data;
136 }
137 
138 function ‪setup_menu( localClientNum, menu_data, previous_menu )
139 {
140  // handle closing the previous menu
141  if ( isdefined( previous_menu ) && isdefined( level.client_menus[localClientNum][previous_menu.menu_name] ) )
142  {
143  previous_menu_info = level.client_menus[localClientNum][previous_menu.menu_name];
144 
145  if ( isdefined( previous_menu_info.custom_close_fn ) )
146  {
147  if ( isarray( previous_menu_info.custom_close_fn ) )
148  {
149  foreach ( fn in previous_menu_info.custom_close_fn )
150  {
151  [[fn]]( localClientNum, previous_menu_info );
152  }
153  }
154  else
155  {
156  [[previous_menu_info.custom_close_fn]]( localClientNum, previous_menu_info );
157  }
158  }
159 
160  if ( isdefined( previous_menu_info.extra_cams ) )
161  {
162  foreach ( extracam_data in previous_menu_info.extra_cams )
163  {
164  ‪multi_extracam::extracam_reset_index( localClientNum, extracam_data.extracam_index );
165  }
166  }
167 
168  level notify( previous_menu.menu_name + "_closed" );
169  if ( isdefined( previous_menu_info.camera_function ) )
170  {
171  StopMainCamXCam( localClientNum );
172  }
173  else if ( isdefined( previous_menu_info.xcam ) )
174  {
175  StopMainCamXCam( localClientNum );
176  }
177 
178  if ( isdefined( previous_menu_info.custom_character ) )
179  {
180  previous_menu_info.custom_character.characterModel Hide();
181  }
182 
183  if ( isdefined( previous_menu_info.exploders ) )
184  {
185  foreach ( ‪exploder in previous_menu_info.exploders )
186  {
187  KillRadiantExploder( localClientNum, ‪exploder );
188  }
189  }
190  }
191 
192  // setup our new menu
193  if ( isdefined( menu_data ) && isdefined( level.client_menus[localClientNum][menu_data.menu_name] ) )
194  {
195  new_menu = level.client_menus[localClientNum][menu_data.menu_name];
196 
197  if ( isdefined( new_menu.custom_character ) )
198  {
199  new_menu.custom_character.characterModel Show();
200  }
201 
202  if ( isdefined( new_menu.exploders ) )
203  {
204  foreach ( ‪exploder in new_menu.exploders )
205  {
206  PlayRadiantExploder( localClientNum, ‪exploder );
207  }
208  }
209 
210  if ( isdefined( new_menu.camera_function ) )
211  {
212  if ( new_menu.has_state === true )
213  {
214  level thread [[new_menu.camera_function]]( localClientNum, menu_data.menu_name, menu_data.state );
215  }
216  else
217  {
218  level thread [[new_menu.camera_function]]( localClientNum, menu_data.menu_name );
219  }
220  }
221  else if ( isdefined( new_menu.xcam ) )
222  {
223  camera_ent = ‪struct::get( new_menu.target_name );
224  if ( isdefined( camera_ent ) )
225  {
226  PlayMainCamXCam( localclientnum, new_menu.xcam, 0, new_menu.sub_xcam, "", camera_ent.origin, camera_ent.angles );
227  }
228  }
229 
230  if ( isdefined( new_menu.custom_open_fn ) )
231  {
232  if ( isarray( new_menu.custom_open_fn ) )
233  {
234  foreach ( fn in new_menu.custom_open_fn )
235  {
236  [[fn]]( localClientNum, new_menu );
237  }
238  }
239  else
240  {
241  [[new_menu.custom_open_fn]]( localClientNum, new_menu );
242  }
243  }
244 
245  if ( isdefined( new_menu.extra_cams ) )
246  {
247  foreach ( extracam_data in new_menu.extra_cams )
248  {
249  if( isdefined( extracam_data.camera_function ) )
250  {
251  if ( new_menu.has_state === true )
252  {
253  level thread [[extracam_data.camera_function]]( localClientNum, menu_data.menu_name, extracam_data, menu_data.state );
254  }
255  else
256  {
257  level thread [[extracam_data.camera_function]]( localClientNum, menu_data.menu_name, extracam_data );
258  }
259  }
260  else
261  {
262  camera_ent = ‪multi_extracam::extracam_init_index( localClientNum, extracam_data.target_name, extracam_data.extracam_index );
263  if ( isdefined( camera_ent ) )
264  {
265  if ( isdefined( extracam_data.xcam_frame ) )
266  {
267  camera_ent PlayExtraCamXCam( extracam_data.xcam, 0, extracam_data.sub_xcam, extracam_data.xcam_frame );
268  }
269  else
270  {
271  camera_ent PlayExtraCamXCam( extracam_data.xcam, 0, extracam_data.sub_xcam );
272  }
273  }
274  }
275  }
276  }
277  }
278 }
279 
280 function ‪client_menus( localClientNum )
281 {
282  level endon("disconnect");
283 
284  clientMenuStack = ‪array();
285 
286  while(1)
287  {
288  level waittill( "menu_change" + localClientNum, menu_name, status, state );
289 
290  menu_index = undefined;
291  for (i = 0; i < clientMenuStack.size; i++ )
292  {
293  if ( clientMenuStack[i].menu_name == menu_name )
294  {
295  menu_index = i;
296  break;
297  }
298  }
299 
300  if ( ( status === "closeToMenu" ) && isdefined( menu_index ) )
301  {
302  topMenu = undefined;
303  for( i = 0; i < menu_index; i++ )
304  {
305  popped = array::pop_front( clientMenuStack, false );
306  if( !isdefined( topMenu ) )
307  {
308  topMenu = popped;
309  }
310  }
311 
312  ‪setup_menu( localClientNum, clientMenuStack[0], topMenu );
313  continue;
314  }
315 
316  ‪stateChange = ( isdefined( menu_index ) && status !== "closed" && clientMenuStack[menu_index].state !== state && !( !isdefined( clientMenuStack[menu_index].state ) && !isdefined( state ) ) );
317  updateOnly = ( ‪stateChange && menu_index !== 0 );
318 
319  if ( updateOnly )
320  {
321  clientMenuStack[i].state = state;
322  }
323  else
324  {
325  if ( ( status === "closed" || ‪stateChange ) && isdefined( menu_index ) )
326  {
327  popped = undefined;
328  // don't want asserts at e3 so gracefully handle this hard to repro bug
329  if ( GetDvarInt( "ui_execdemo_e3" ) == 1 ) //&& menu_index > 0 )
330  {
331  while ( menu_index >= 0 )
332  {
333  ‪DEFAULT( popped, array::pop_front( clientMenuStack, false ) );
334  menu_index--;
335  }
336  }
337  else
338  {
339  assert( menu_index == 0 );
340  popped = array::pop_front( clientMenuStack, false );
341  }
342 
343  ‪setup_menu( localClientNum, clientMenuStack[0], popped );
344  }
345 
346  if ( status === "opened" && ( !isdefined( menu_index ) || ‪stateChange ) )
347  {
348  menu_data = SpawnStruct();
349  menu_data.menu_name = menu_name;
350  menu_data.state = state;
351 
352  lastMenu = ( clientMenuStack.size > 0 ? clientMenuStack[0] : undefined );
353  ‪setup_menu( localClientNum, menu_data, lastMenu );
354  array::push_front( clientMenuStack, menu_data );
355  }
356  }
357  }
358 }
359 
360 
372 function ‪screen_fade( n_time, n_target_alpha = 1, n_start_alpha = 0, str_color = "black", b_force_close_menu = false )
373 {
374  if ( self == level )
375  {
376  foreach ( player in level.players )
377  {
378  player thread ‪_screen_fade( n_time, n_target_alpha, n_start_alpha, str_color, b_force_close_menu );
379  }
380  }
381  else
382  {
383  self thread ‪_screen_fade( n_time, n_target_alpha, n_start_alpha, str_color, b_force_close_menu );
384  }
385 }
386 
396 function ‪screen_fade_out( n_time, str_color )
397 {
398  ‪screen_fade( n_time, 1, 0, str_color, false );
399  wait n_time;
400 }
401 
411 function ‪screen_fade_in( n_time, str_color )
412 {
413  ‪screen_fade( n_time, 0, 1, str_color, true );
414  wait n_time;
415 }
416 
424 {
425  if ( self == level )
426  {
427  foreach ( player in level.players )
428  {
429  player thread ‪_screen_close_menu();
430  }
431  }
432  else
433  {
434  self thread ‪_screen_close_menu();
435  }
436 }
437 
438 function private ‪_screen_close_menu()
439 {
440  self notify( "_screen_fade" );
441  self endon( "_screen_fade" );
442  self endon( "disconnect" );
443 
444  if(isdefined(self.screen_fade_menus))
445  {
446  str_menu = "FullScreenBlack";
447 
448  if ( isdefined( self.screen_fade_menus[ str_menu ] ) )
449  {
450  CloseLUIMenu( self.localClientNum, self.screen_fade_menus[ str_menu ].lui_menu );
451  self.screen_fade_menus[ str_menu ] = undefined;
452  }
453 
454  str_menu = "FullScreenWhite";
455 
456  if ( isdefined( self.screen_fade_menus[ str_menu ] ) )
457  {
458  CloseLUIMenu( self.localClientNum, self.screen_fade_menus[ str_menu ].lui_menu );
459  self.screen_fade_menus[ str_menu ] = undefined;
460  }
461  }
462 }
463 
464 function private ‪_screen_fade( n_time, n_target_alpha, n_start_alpha, v_color, b_force_close_menu )
465 {
466  self notify( "_screen_fade" );
467  self endon( "_screen_fade" );
468  self endon( "disconnect" );
469  self endon( "entityshutdown" );
470 
471  ‪DEFAULT( self.screen_fade_menus, [] );
472  ‪DEFAULT( v_color, ( 0, 0, 0 ) );
473 
474  n_time_ms = int( n_time * 1000 );
475 
476  str_menu = "FullScreenBlack";
477 
478  if ( IsString( v_color ) )
479  {
480  switch ( v_color )
481  {
482  case "black":
483  v_color = ( 0, 0, 0 );
484  break;
485 
486  case "white":
487  v_color = ( 1, 1, 1 );
488  break;
489 
490  default: AssertMsg( "Unsupported color for screen fade." );
491  }
492  }
493 
494  lui_menu = "";
495 
496  if ( isdefined( self.screen_fade_menus[ str_menu ] ) )
497  {
498  /* Close current menu */
499 
500  s_menu = self.screen_fade_menus[ str_menu ];
501  lui_menu = s_menu.lui_menu;
502 
503  CloseLUIMenu( self.localClientNum, lui_menu );
504 
505  /* Calculate the current alpha since we can't get it directly from the menu */
506 
507  n_start_alpha = LerpFloat( s_menu.n_start_alpha, s_menu.n_target_alpha, GetTime() - s_menu.n_start_time );
508  }
509 
510  lui_menu = CreateLUIMenu( self.localClientNum, str_menu );
511 
512  self.screen_fade_menus[ str_menu ] = SpawnStruct();
513  self.screen_fade_menus[ str_menu ].lui_menu = lui_menu;
514 
515  self.screen_fade_menus[ str_menu ].n_start_alpha = n_start_alpha;
516  self.screen_fade_menus[ str_menu ].n_target_alpha = n_target_alpha;
517  self.screen_fade_menus[ str_menu ].n_target_time = n_time_ms;
518  self.screen_fade_menus[ str_menu ].n_start_time = GetTime();
519 
520  self ‪set_color( lui_menu, v_color );
521 
522  SetLUIMenuData( self.localClientNum, lui_menu, "startAlpha", n_start_alpha );
523  SetLUIMenuData( self.localClientNum, lui_menu, "endAlpha", n_target_alpha );
524  SetLUIMenuData( self.localClientNum, lui_menu, "fadeOverTime", n_time_ms );
525 
526  OpenLUIMenu( self.localClientNum, lui_menu );
527 
528  wait n_time;
529 
530  if ( b_force_close_menu || ( n_target_alpha == 0 ) )
531  {
532  CloseLUIMenu( self.localClientNum, self.screen_fade_menus[ str_menu ].lui_menu );
533  self.screen_fade_menus[ str_menu ] = undefined;
534  }
535 }
536 
537 function ‪set_color( menu, color )
538 {
539  SetLUIMenuData( self.localClientNum, menu, "red", color[ 0 ] );
540  SetLUIMenuData( self.localClientNum, menu, "green", color[ 1 ] );
541  SetLUIMenuData( self.localClientNum, menu, "blue", color[ 2 ] );
542 }
543 
‪on_player_connect
‪function on_player_connect(localClientNum)
Definition: lui_shared.csc:23
‪exploder
‪function exploder(exploder_id, n_localclientnumber)
Definition: exploder_shared.csc:297
‪setup_menu
‪function setup_menu(localClientNum, menu_data, previous_menu)
Definition: lui_shared.csc:138
‪linkToCustomCharacter
‪function linkToCustomCharacter(menu_name, localClientNum, target_name)
Definition: lui_shared.csc:80
‪__init__
‪function __init__()
Definition: lui_shared.csc:17
‪getCharacterDataForMenu
‪function getCharacterDataForMenu(menu_name, localClientNum)
Definition: lui_shared.csc:98
‪createExtraCamXCamData
‪function createExtraCamXCamData(menu_name, localClientNum, extracam_index, target_name, xcam, sub_xcam, xcam_frame)
Definition: lui_shared.csc:34
‪createCustomCameraMenu
‪function createCustomCameraMenu(menu_name, localClientNum, camera_function, has_state, custom_open_fn=undefined, custom_close_fn=undefined)
Definition: lui_shared.csc:124
‪screen_fade
‪function screen_fade(n_time, n_target_alpha=1, n_start_alpha=0, str_color="black", b_force_close_menu=false)
Definition: lui_shared.csc:372
‪_screen_fade
‪function private _screen_fade(n_time, n_target_alpha, n_start_alpha, v_color, b_force_close_menu)
Definition: lui_shared.csc:464
‪createCustomExtraCamXCamData
‪function createCustomExtraCamXCamData(menu_name, localClientNum, extracam_index, camera_function)
Definition: lui_shared.csc:49
‪addMenuExploders
‪function addMenuExploders(menu_name, localClientNum, exploder)
Definition: lui_shared.csc:61
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪spawn_model
‪function spawn_model(n_client, str_model, origin=(0, 0, 0), angles=(0, 0, 0))
Definition: util_shared.csc:92
‪_screen_close_menu
‪function private _screen_close_menu()
Definition: lui_shared.csc:438
‪stateChange
‪function stateChange(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _qrdrone.csc:68
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪set_color
‪function set_color(menu, color)
Definition: lui_shared.csc:537
‪on_localclient_connect
‪function on_localclient_connect(localClientNum)
Definition: ctf.csc:20
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪extracam_reset_index
‪function extracam_reset_index(localClientNum, index)
Definition: _multi_extracam.csc:13
‪client_menus
‪function client_menus(localClientNum)
Definition: lui_shared.csc:280
‪extracam_init_index
‪function extracam_init_index(localClientNum, target, index)
Definition: _multi_extracam.csc:28
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪array
‪function filter array
Definition: array_shared.csc:16
‪create_character_data_struct
‪function create_character_data_struct(characterModel, localClientNum, alt_render_mode=true)
Definition: _character_customization.csc:82
‪screen_fade_out
‪function screen_fade_out(n_time, str_color)
Definition: lui_shared.csc:396
‪initMenuData
‪function initMenuData(localClientNum)
Definition: lui_shared.csc:28
‪createCameraMenu
‪function createCameraMenu(menu_name, localClientNum, target_name, xcam, sub_xcam, xcam_frame=undefined, custom_open_fn=undefined, custom_close_fn=undefined)
Definition: lui_shared.csc:108
‪screen_fade_in
‪function screen_fade_in(n_time, str_color)
Definition: lui_shared.csc:411
‪screen_close_menu
‪function screen_close_menu()
Definition: lui_shared.csc:423