1 #using scripts\codescripts\struct;
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;
9 #using scripts\core\_multi_extracam;
11 #insert scripts\shared\shared.gsh;
19 level.client_menus = associativeArray();
30 assert( !isdefined( level.client_menus[localClientNum] ) );
31 level.client_menus[localClientNum] = associativeArray();
36 assert( isdefined( level.client_menus[localClientNum][menu_name] ) );
37 menu_data = level.client_menus[localClientNum][menu_name];
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;
46 ARRAY_ADD( menu_data.extra_cams, extracam_data );
51 assert( isdefined( level.client_menus[localClientNum][menu_name] ) );
52 menu_data = level.client_menus[localClientNum][menu_name];
54 extracam_data = SpawnStruct();
55 extracam_data.extracam_index = extracam_index;
56 extracam_data.camera_function = camera_function;
58 ARRAY_ADD( menu_data.extra_cams, extracam_data );
63 assert( isdefined( level.client_menus[localClientNum][menu_name] ) );
64 menu_data = level.client_menus[localClientNum][menu_name];
79 #using_animtree( "all_player" );
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 ) );
86 model = GetEnt( localClientNum, target_name,
"targetname" );
87 if ( !isdefined( model ) )
90 model.targetname = target_name;
92 model UseAnimTree( #animtree );
100 if ( isdefined( level.client_menus[localClientNum][menu_name] ) )
102 return level.client_menus[localClientNum][menu_name].custom_character;
108 function createCameraMenu( menu_name, localClientNum, target_name, xcam, sub_xcam, xcam_frame = undefined, custom_open_fn = undefined, custom_close_fn = undefined )
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];
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;
124 function createCustomCameraMenu( menu_name, localClientNum, camera_function, has_state, custom_open_fn = undefined, custom_close_fn = undefined )
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];
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;
141 if ( isdefined( previous_menu ) && isdefined( level.client_menus[localClientNum][previous_menu.menu_name] ) )
143 previous_menu_info = level.client_menus[localClientNum][previous_menu.menu_name];
145 if ( isdefined( previous_menu_info.custom_close_fn ) )
147 if ( isarray( previous_menu_info.custom_close_fn ) )
149 foreach ( fn
in previous_menu_info.custom_close_fn )
151 [[fn]]( localClientNum, previous_menu_info );
156 [[previous_menu_info.custom_close_fn]]( localClientNum, previous_menu_info );
160 if ( isdefined( previous_menu_info.extra_cams ) )
162 foreach ( extracam_data
in previous_menu_info.extra_cams )
168 level notify( previous_menu.menu_name +
"_closed" );
169 if ( isdefined( previous_menu_info.camera_function ) )
171 StopMainCamXCam( localClientNum );
173 else if ( isdefined( previous_menu_info.xcam ) )
175 StopMainCamXCam( localClientNum );
178 if ( isdefined( previous_menu_info.custom_character ) )
180 previous_menu_info.custom_character.characterModel Hide();
183 if ( isdefined( previous_menu_info.exploders ) )
185 foreach (
exploder in previous_menu_info.exploders )
187 KillRadiantExploder( localClientNum,
exploder );
193 if ( isdefined( menu_data ) && isdefined( level.client_menus[localClientNum][menu_data.menu_name] ) )
195 new_menu = level.client_menus[localClientNum][menu_data.menu_name];
197 if ( isdefined( new_menu.custom_character ) )
199 new_menu.custom_character.characterModel Show();
202 if ( isdefined( new_menu.exploders ) )
204 foreach (
exploder in new_menu.exploders )
206 PlayRadiantExploder( localClientNum,
exploder );
210 if ( isdefined( new_menu.camera_function ) )
212 if ( new_menu.has_state ===
true )
214 level thread [[new_menu.camera_function]]( localClientNum, menu_data.menu_name, menu_data.state );
218 level thread [[new_menu.camera_function]]( localClientNum, menu_data.menu_name );
221 else if ( isdefined( new_menu.xcam ) )
224 if ( isdefined( camera_ent ) )
226 PlayMainCamXCam( localclientnum, new_menu.xcam, 0, new_menu.sub_xcam,
"", camera_ent.origin, camera_ent.angles );
230 if ( isdefined( new_menu.custom_open_fn ) )
232 if ( isarray( new_menu.custom_open_fn ) )
234 foreach ( fn
in new_menu.custom_open_fn )
236 [[fn]]( localClientNum, new_menu );
241 [[new_menu.custom_open_fn]]( localClientNum, new_menu );
245 if ( isdefined( new_menu.extra_cams ) )
247 foreach ( extracam_data
in new_menu.extra_cams )
249 if( isdefined( extracam_data.camera_function ) )
251 if ( new_menu.has_state ===
true )
253 level thread [[extracam_data.camera_function]]( localClientNum, menu_data.menu_name, extracam_data, menu_data.state );
257 level thread [[extracam_data.camera_function]]( localClientNum, menu_data.menu_name, extracam_data );
263 if ( isdefined( camera_ent ) )
265 if ( isdefined( extracam_data.xcam_frame ) )
267 camera_ent PlayExtraCamXCam( extracam_data.xcam, 0, extracam_data.sub_xcam, extracam_data.xcam_frame );
271 camera_ent PlayExtraCamXCam( extracam_data.xcam, 0, extracam_data.sub_xcam );
282 level endon(
"disconnect");
284 clientMenuStack =
array();
288 level waittill(
"menu_change" + localClientNum, menu_name, status, state );
290 menu_index = undefined;
291 for (i = 0; i < clientMenuStack.size; i++ )
293 if ( clientMenuStack[i].menu_name == menu_name )
300 if ( ( status ===
"closeToMenu" ) && isdefined( menu_index ) )
303 for( i = 0; i < menu_index; i++ )
305 popped = array::pop_front( clientMenuStack,
false );
306 if( !isdefined( topMenu ) )
312 setup_menu( localClientNum, clientMenuStack[0], topMenu );
316 stateChange = ( isdefined( menu_index ) && status !==
"closed" && clientMenuStack[menu_index].state !== state && !( !isdefined( clientMenuStack[menu_index].state ) && !isdefined( state ) ) );
321 clientMenuStack[i].state = state;
325 if ( ( status ===
"closed" ||
stateChange ) && isdefined( menu_index ) )
329 if ( GetDvarInt(
"ui_execdemo_e3" ) == 1 )
331 while ( menu_index >= 0 )
333 DEFAULT( popped, array::pop_front( clientMenuStack,
false ) );
339 assert( menu_index == 0 );
340 popped = array::pop_front( clientMenuStack,
false );
343 setup_menu( localClientNum, clientMenuStack[0], popped );
346 if ( status ===
"opened" && ( !isdefined( menu_index ) ||
stateChange ) )
348 menu_data = SpawnStruct();
349 menu_data.menu_name = menu_name;
350 menu_data.state = state;
352 lastMenu = ( clientMenuStack.size > 0 ? clientMenuStack[0] : undefined );
353 setup_menu( localClientNum, menu_data, lastMenu );
354 array::push_front( clientMenuStack, menu_data );
372 function screen_fade( n_time, n_target_alpha = 1, n_start_alpha = 0, str_color =
"black", b_force_close_menu =
false )
376 foreach ( player
in level.players )
378 player thread
_screen_fade( n_time, n_target_alpha, n_start_alpha, str_color, b_force_close_menu );
383 self thread
_screen_fade( n_time, n_target_alpha, n_start_alpha, str_color, b_force_close_menu );
427 foreach ( player
in level.players )
440 self notify(
"_screen_fade" );
441 self endon(
"_screen_fade" );
442 self endon(
"disconnect" );
444 if(isdefined(
self.screen_fade_menus))
446 str_menu =
"FullScreenBlack";
448 if ( isdefined(
self.screen_fade_menus[ str_menu ] ) )
450 CloseLUIMenu(
self.localClientNum,
self.screen_fade_menus[ str_menu ].lui_menu );
451 self.screen_fade_menus[ str_menu ] = undefined;
454 str_menu =
"FullScreenWhite";
456 if ( isdefined(
self.screen_fade_menus[ str_menu ] ) )
458 CloseLUIMenu(
self.localClientNum,
self.screen_fade_menus[ str_menu ].lui_menu );
459 self.screen_fade_menus[ str_menu ] = undefined;
464 function private _screen_fade( n_time, n_target_alpha, n_start_alpha, v_color, b_force_close_menu )
466 self notify(
"_screen_fade" );
467 self endon(
"_screen_fade" );
468 self endon(
"disconnect" );
469 self endon(
"entityshutdown" );
471 DEFAULT(
self.screen_fade_menus, [] );
474 n_time_ms = int( n_time * 1000 );
476 str_menu =
"FullScreenBlack";
478 if ( IsString( v_color ) )
483 v_color = ( 0, 0, 0 );
487 v_color = ( 1, 1, 1 );
490 default: AssertMsg(
"Unsupported color for screen fade." );
496 if ( isdefined(
self.screen_fade_menus[ str_menu ] ) )
500 s_menu =
self.screen_fade_menus[ str_menu ];
501 lui_menu = s_menu.lui_menu;
503 CloseLUIMenu(
self.localClientNum, lui_menu );
507 n_start_alpha = LerpFloat( s_menu.n_start_alpha, s_menu.n_target_alpha, GetTime() - s_menu.n_start_time );
510 lui_menu = CreateLUIMenu(
self.localClientNum, str_menu );
512 self.screen_fade_menus[ str_menu ] = SpawnStruct();
513 self.screen_fade_menus[ str_menu ].lui_menu = lui_menu;
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();
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 );
526 OpenLUIMenu(
self.localClientNum, lui_menu );
530 if ( b_force_close_menu || ( n_target_alpha == 0 ) )
532 CloseLUIMenu(
self.localClientNum,
self.screen_fade_menus[ str_menu ].lui_menu );
533 self.screen_fade_menus[ str_menu ] = undefined;
539 SetLUIMenuData(
self.localClientNum, menu,
"red", color[ 0 ] );
540 SetLUIMenuData(
self.localClientNum, menu,
"green", color[ 1 ] );
541 SetLUIMenuData(
self.localClientNum, menu,
"blue", color[ 2 ] );