1 #using scripts\shared\callbacks_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\math_shared;
4 #using scripts\shared\system_shared;
5 #using scripts\shared\util_shared;
7 #insert scripts\shared\shared.gsh;
8 #insert scripts\shared\version.gsh;
10 #namespace visionset_mgr;
16 level.vsmgr_initializing =
true;
17 level.vsmgr_default_info_name =
"__none";
30 function register_info( type,
name, version, priority, lerp_step_count, should_activate_per_player, lerp_thread, ref_count_lerp_thread )
32 assert( level.vsmgr_initializing,
"All info registration in the visionset_mgr system must occur during the first frame while the system is initializing" );
34 lower_name = ToLower(
name );
40 level.vsmgr[type].info[lower_name] = spawnstruct();
41 level.vsmgr[type].info[lower_name]
add_info( type, lower_name, version, priority, lerp_step_count, should_activate_per_player, lerp_thread, ref_count_lerp_thread );
43 if ( level.vsmgr[type].highest_version < version )
45 level.vsmgr[type].highest_version = version;
50 function activate( type,
name, player, opt_param_1, opt_param_2, opt_param_3 )
52 if ( level.vsmgr[type].info[
name].state.should_activate_per_player )
58 state = level.vsmgr[type].info[
name].state;
60 if ( state.ref_count_lerp_thread )
63 if ( 1 < state.ref_count )
69 if ( isdefined( state.lerp_thread ) )
75 players = GetPlayers();
76 for ( player_index = 0; player_index < players.size; player_index++ )
86 if ( level.vsmgr[type].info[
name].state.should_activate_per_player )
92 state = level.vsmgr[type].info[
name].state;
94 if ( state.ref_count_lerp_thread )
97 if ( 0 < state.ref_count )
103 players = GetPlayers();
104 for ( player_index = 0; player_index < players.size; player_index++ )
109 state notify(
"visionset_mgr_deactivate_all" );
115 player_entnum = player GetEntityNumber();
117 if ( !IsDefined(
self.players[player_entnum] ) )
122 self.players[player_entnum].active =
true;
123 self.players[player_entnum].lerp =
lerp;
129 player_entnum = player GetEntityNumber();
131 if ( !IsDefined(
self.players[player_entnum] ) )
136 self.players[player_entnum].active =
false;
137 self.players[player_entnum].lerp = 0;
143 players = GetPlayers();
144 for ( player_index = 0; player_index < players.size; player_index++ )
167 start_time = GetTime();
168 end_time = start_time + int( duration * 1000 );
170 if ( isdefined( max_duration ) )
174 start_time = end_time - int( max_duration * 1000 );
186 players = GetPlayers();
187 for ( player_index = 0; player_index < players.size; player_index++ )
201 start_time = GetTime();
202 end_time = start_time + int( duration * 1000 );
204 if ( isdefined( max_duration ) )
208 start_time = end_time - int( max_duration * 1000 );
231 start_time = GetTime();
232 end_time = start_time + int( duration * 1000 );
252 level endon(
"kill_ramp_in_out_thread_hold_func" );
256 for ( player_index = 0; player_index < level.players.size; player_index++ )
268 start_time = GetTime();
269 end_time = start_time + int( ramp_in * 1000 );
280 players = GetPlayers();
281 for ( player_index = 0; player_index < players.size; player_index++ )
290 if ( IsFunctionPtr( full_period ) )
292 self [[full_period]]();
298 level notify(
"kill_ramp_in_out_thread_hold_func" );
300 start_time = GetTime();
301 end_time = start_time + int( ramp_out * 1000 );
312 players = GetPlayers();
313 for ( player_index = 0; player_index < players.size; player_index++ )
326 start_time = GetTime();
327 end_time = start_time + int( ramp_in * 1000 );
345 if ( IsFunctionPtr( full_period ) )
347 player [[full_period]]();
354 start_time = GetTime();
355 end_time = start_time + int( ramp_out * 1000 );
376 player notify(
"ramp_in_out_thread_watch_player_shutdown" );
377 player endon(
"ramp_in_out_thread_watch_player_shutdown" );
378 player endon(
"disconnect" );
379 player waittill(
"death" );
381 if ( player IsRemoteControlling() ==
false )
387 player endon (
"death" );
399 level.vsmgr[type] = spawnstruct();
401 level.vsmgr[type].type = type;
402 level.vsmgr[type].in_use =
false;
403 level.vsmgr[type].highest_version = 0;
404 level.vsmgr[type].cf_slot_name = type +
"_slot";
405 level.vsmgr[type].cf_lerp_name = type +
"_lerp";
406 level.vsmgr[type].info = [];
407 level.vsmgr[type].sorted_name_keys = [];
408 level.vsmgr[type].sorted_prio_keys = [];
416 typeKeys = GetArrayKeys( level.vsmgr );
417 for ( type_index = 0; type_index < typeKeys.size; type_index++ )
422 level.vsmgr_initializing =
false;
428 /#println(
"visionset_mgr [" +
self.type +
"] server registrations:" );#/
430 if ( 1 >=
self.info.size )
436 self.cf_slot_bit_count = GetMinBitCountForNum(
self.info.size - 1 );
437 self.cf_lerp_bit_count =
self.info[
self.sorted_name_keys[0]].lerp_bit_count;
439 for ( i = 0; i <
self.sorted_name_keys.size; i++ )
441 self.info[
self.sorted_name_keys[i]].slot_index = i;
443 if (
self.info[
self.sorted_name_keys[i]].lerp_bit_count >
self.cf_lerp_bit_count )
445 self.cf_lerp_bit_count =
self.info[
self.sorted_name_keys[i]].lerp_bit_count;
448 /#println(
" name: " +
self.info[
self.sorted_name_keys[i]].
name +
", version: " +
self.info[
self.sorted_name_keys[i]].version +
", lerp_step_count: " +
self.info[
self.sorted_name_keys[i]].lerp_step_count +
"" );#/
451 clientfield::register(
"toplayer",
self.cf_slot_name,
self.highest_version,
self.cf_slot_bit_count,
"int" );
454 if ( 1 <
self.cf_lerp_bit_count )
456 clientfield::register(
"toplayer",
self.cf_lerp_name,
self.highest_version,
self.cf_lerp_bit_count,
"float" );
463 keys = GetArrayKeys( level.vsmgr );
464 for ( i = 0; i < keys.size; i++ )
466 if ( type == keys[i] )
472 assert( i < keys.size,
"In visionset_mgr, type '" + type +
"'is unknown" );
474 keys = GetArrayKeys( level.vsmgr[type].info );
475 for ( i = 0; i < keys.size; i++ )
477 assert( level.vsmgr[type].info[keys[i]].name !=
name,
"In visionset_mgr of type '" + type +
"': name '" +
name +
"' has previously been registered" );
478 assert( level.vsmgr[type].info[keys[i]].priority != priority,
"In visionset_mgr of type '" + type +
"': priority '" + priority +
"' requested for name '" +
name +
"' has previously been registered under name '" + level.vsmgr[type].info[keys[i]].name +
"'");
485 for ( i = 0; i < level.vsmgr[type].sorted_name_keys.size; i++ )
487 if (
name < level.vsmgr[type].sorted_name_keys[i] )
493 ArrayInsert( level.vsmgr[type].sorted_name_keys,
name, i );
499 for ( i = 0; i < level.vsmgr[type].sorted_prio_keys.size; i++ )
501 if ( priority > level.vsmgr[type].info[level.vsmgr[type].sorted_prio_keys[i]].priority )
507 ArrayInsert( level.vsmgr[type].sorted_prio_keys,
name, i );
511 function add_info( type,
name, version, priority, lerp_step_count, should_activate_per_player, lerp_thread, ref_count_lerp_thread )
515 self.version = version;
516 self.priority = priority;
517 self.lerp_step_count = lerp_step_count;
518 self.lerp_bit_count = GetMinBitCountForNum( lerp_step_count );
520 if ( !isdefined( ref_count_lerp_thread ) )
522 ref_count_lerp_thread =
false;
525 self.state = spawnstruct();
526 self.state.type = type;
527 self.state.name =
name;
528 self.state.should_activate_per_player = should_activate_per_player;
529 self.state.lerp_thread = lerp_thread;
530 self.state.ref_count_lerp_thread = ref_count_lerp_thread;
531 self.state.players = [];
533 if ( ref_count_lerp_thread && !should_activate_per_player )
535 self.state.ref_count = 0;
547 self.vsmgr_player_entnum =
self GetEntityNumber();
549 typeKeys = GetArrayKeys( level.vsmgr );
550 for ( type_index = 0; type_index < typeKeys.size; type_index++ )
552 type = typeKeys[type_index];
554 if ( !level.vsmgr[type].in_use )
559 for ( name_index = 0; name_index < level.vsmgr[type].sorted_name_keys.size; name_index++ )
561 name_key = level.vsmgr[type].sorted_name_keys[name_index];
563 level.vsmgr[type].info[name_key].state.players[
self.vsmgr_player_entnum] = SpawnStruct();
565 level.vsmgr[type].info[name_key].state.players[
self.vsmgr_player_entnum].active =
false;
566 level.vsmgr[type].info[name_key].state.players[
self.vsmgr_player_entnum].lerp = 0;
568 if ( level.vsmgr[type].info[name_key].state.ref_count_lerp_thread && level.vsmgr[type].info[name_key].state.should_activate_per_player )
570 level.vsmgr[type].info[name_key].state.players[
self.vsmgr_player_entnum].ref_count = 0;
574 level.vsmgr[type].info[level.vsmgr_default_info_name].state
set_state_active(
self, 1 );
580 self.vsmgr_player_entnum =
self GetEntityNumber();
582 typeKeys = GetArrayKeys( level.vsmgr );
583 for ( type_index = 0; type_index < typeKeys.size; type_index++ )
585 type = typeKeys[type_index];
587 if ( !level.vsmgr[type].in_use )
592 for ( name_index = 0; name_index < level.vsmgr[type].sorted_name_keys.size; name_index++ )
594 name_key = level.vsmgr[type].sorted_name_keys[name_index];
604 while ( level.vsmgr_initializing )
609 typeKeys = GetArrayKeys( level.vsmgr );
616 players = GetPlayers();
618 for ( type_index = 0; type_index < typeKeys.size; type_index++ )
620 type = typeKeys[type_index];
622 if ( !level.vsmgr[type].in_use )
627 for ( player_index = 0; player_index < players.size; player_index++ )
629 if ( !IsDefined( players[player_index].vsmgr_player_entnum ) )
645 size = type_struct.sorted_prio_keys.size;
647 for ( prio_index = 0; prio_index < size; prio_index++ )
649 prio_key = type_struct.sorted_prio_keys[prio_index];
651 if ( type_struct.info[prio_key].state.players[
self.vsmgr_player_entnum].active )
657 return level.vsmgr_default_info_name;
669 if ( 1 < type_struct.cf_lerp_bit_count )
678 self notify(
"visionset_mgr_deactivate_all" );
679 self endon(
"visionset_mgr_deactivate_all" );
681 self [[func]]( opt_param_1, opt_param_2, opt_param_3 );
687 player_entnum = player GetEntityNumber();
688 self.players[player_entnum] notify(
"visionset_mgr_deactivate" );
689 self.players[player_entnum] endon(
"visionset_mgr_deactivate" );
690 player endon(
"disconnect" );
692 self [[func]]( player, opt_param_1, opt_param_2, opt_param_3 );
698 player_entnum = player GetEntityNumber();
699 state = level.vsmgr[type].info[
name].state;
701 if ( state.ref_count_lerp_thread )
703 state.players[player_entnum].ref_count++;
704 if ( 1 < state.players[player_entnum].ref_count )
710 if ( isdefined( state.lerp_thread ) )
723 player_entnum = player GetEntityNumber();
725 state = level.vsmgr[type].info[
name].state;
727 if ( state.ref_count_lerp_thread )
729 state.players[player_entnum].ref_count--;
730 if ( 0 < state.players[player_entnum].ref_count )
738 state.players[player_entnum] notify(
"visionset_mgr_deactivate" );
744 if( 0 >= ( end_time - start_time ) )
751 frac = float(now - start_time) / float(end_time - start_time);
759 if( 0 >= ( end_time - start_time ) )
766 frac = float(end_time - now) / float(end_time - start_time);