Added _visionset_mgr.gsc to 18 Player ZM Fixes

This commit is contained in:
JezuzLizard 2021-07-28 19:22:41 -07:00
parent bb3a659501
commit 798e0af549

View File

@ -0,0 +1,474 @@
//checked includes matches beta dump
#include maps/mp/_utility;
#include common_scripts/utility;
init() //checked matches beta dump
{
if ( level.createfx_enabled )
{
return;
}
level.vsmgr_initializing = 1;
level.vsmgr_default_info_name = "none";
level.vsmgr = [];
level thread register_type( "visionset" );
level thread register_type( "overlay" );
onfinalizeinitialization_callback( ::finalize_clientfields );
level thread monitor();
level thread onplayerconnect();
}
vsmgr_register_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ) //checked matches beta dump
{
if ( level.createfx_enabled )
{
return;
}
/*
/#
assert( level.vsmgr_initializing, "All info registration in the visionset_mgr system must occur during the first frame while the system is initializing" );
#/
*/
lower_name = tolower( name );
validate_info( type, lower_name, priority );
add_sorted_name_key( type, lower_name );
add_sorted_priority_key( type, lower_name, priority );
level.vsmgr[ type ].info[ lower_name ] = spawnstruct();
level.vsmgr[ type ].info[ lower_name ] add_info( type, lower_name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread );
if ( level.vsmgr[ type ].highest_version < version )
{
level.vsmgr[ type ].highest_version = version;
}
}
vsmgr_activate( type, name, player, opt_param_1, opt_param_2 ) //checked changed to match beta dump
{
if ( level.vsmgr[ type ].info[ name ].state.activate_per_player )
{
activate_per_player( type, name, player, opt_param_1, opt_param_2 );
return;
}
state = level.vsmgr[ type ].info[ name ].state;
if ( state.ref_count_lerp_thread )
{
state.ref_count++;
if ( state.ref_count > 1 )
{
return;
}
}
if ( isDefined( state.lerp_thread ) )
{
state thread lerp_thread_wrapper( state.lerp_thread, opt_param_1, opt_param_2 );
}
else
{
players = getplayers();
for( player_index = 0; player_index < players.size; player_index++ )
{
state vsmgr_set_state_active( players[ player_index ], 1 );
}
}
}
vsmgr_deactivate( type, name, player ) //checked changed to match beta dump
{
if ( level.vsmgr[ type ].info[ name ].state.activate_per_player )
{
deactivate_per_player( type, name, player );
return;
}
state = level.vsmgr[ type ].info[ name ].state;
if ( state.ref_count_lerp_thread )
{
state.ref_count--;
if ( state.ref_count > 0 )
{
return;
}
}
state notify( "deactivate" );
players = getplayers();
for( player_index = 0; player_index < players.size; player_index++ )
{
state vsmgr_set_state_inactive( players[ player_index ] );
}
}
vsmgr_set_state_active( player, lerp ) //checked matches cerberus output
{
player_entnum = player getentitynumber();
if ( !isDefined( self.players[ player_entnum ] ) )
{
return;
}
self.players[ player_entnum ].active = 1;
self.players[ player_entnum ].lerp = lerp;
}
vsmgr_set_state_inactive( player ) //checked matches cerberus output
{
player_entnum = player getentitynumber();
if ( !isDefined( self.players[ player_entnum ] ) )
{
return;
}
self.players[ player_entnum ].active = 0;
self.players[ player_entnum ].lerp = 0;
}
vsmgr_timeout_lerp_thread( timeout, opt_param_2 ) //checked changed to match beta dump
{
players = getplayers();
for( player_index = 0; player_index < players.size; player_index++ )
{
self vsmgr_set_state_active( players[ player_index ], 1 );
}
wait timeout;
vsmgr_deactivate( self.type, self.name );
}
vsmgr_timeout_lerp_thread_per_player( player, timeout, opt_param_2 ) //checked matches beta dump
{
self vsmgr_set_state_active( player, 1 );
wait timeout;
deactivate_per_player( self.type, self.name, player );
}
vsmgr_duration_lerp_thread( duration, max_duration ) //checked changed to match beta dump
{
start_time = getTime();
end_time = start_time + int( duration * 1000 );
if ( isDefined( max_duration ) )
{
start_time = end_time - int( max_duration * 1000 );
}
while ( 1 )
{
lerp = calc_remaining_duration_lerp( start_time, end_time );
if ( lerp <= 0 )
{
break;
}
players = getplayers();
for( player_index = 0; player_index < players.size; player_index++ )
{
self vsmgr_set_state_active( players[ player_index ], lerp );
}
wait 0.05;
}
vsmgr_deactivate( self.type, self.name );
}
vsmgr_duration_lerp_thread_per_player( player, duration, max_duration ) //checked changed to match beta dump
{
start_time = getTime();
end_time = start_time + int( duration * 1000 );
if ( isDefined( max_duration ) )
{
start_time = end_time - int( max_duration * 1000 );
}
while ( 1 )
{
lerp = calc_remaining_duration_lerp( start_time, end_time );
if ( lerp <= 0 )
{
break;
}
self vsmgr_set_state_active( player, lerp );
wait 0.05;
}
deactivate_per_player( self.type, self.name, player );
}
register_type( type ) //checked matches beta dump
{
level.vsmgr[ type ] = spawnstruct();
level.vsmgr[ type ].type = type;
level.vsmgr[ type ].in_use = 0;
level.vsmgr[ type ].highest_version = 0;
level.vsmgr[ type ].cf_slot_name = type + "_slot";
level.vsmgr[ type ].cf_lerp_name = type + "_lerp";
level.vsmgr[ type ].info = [];
level.vsmgr[ type ].sorted_name_keys = [];
level.vsmgr[ type ].sorted_prio_keys = [];
vsmgr_register_info( type, level.vsmgr_default_info_name, 1, 0, 1, 0, undefined );
}
finalize_clientfields() //checked changed to match beta dump
{
typekeys = getarraykeys( level.vsmgr );
for ( type_index = 0; type_index < typeKeys.size; type_index++ )
{
level.vsmgr[ typekeys[ type_index ] ] thread finalize_type_clientfields();
}
level.vsmgr_initializing = 0;
}
finalize_type_clientfields() //checked changed to match beta dump
{
if ( self.info.size <= 1 )
{
return;
}
self.in_use = 1;
self.cf_slot_bit_count = getminbitcountfornum( self.info.size - 1 );
self.cf_lerp_bit_count = self.info[ self.sorted_name_keys[ 0 ] ].lerp_bit_count;
for ( i = 0; i < self.sorted_name_keys.size; i++ )
{
self.info[ self.sorted_name_keys[ i ] ].slot_index = i;
if ( self.info[ self.sorted_name_keys[ i ] ].lerp_bit_count > self.cf_lerp_bit_count )
{
self.cf_lerp_bit_count = self.info[ self.sorted_name_keys[ i ] ].lerp_bit_count;
}
}
registerclientfield( "toplayer", self.cf_slot_name, self.highest_version, self.cf_slot_bit_count, "int" );
if ( self.cf_lerp_bit_count > 1 )
{
registerclientfield( "toplayer", self.cf_lerp_name, self.highest_version, self.cf_lerp_bit_count, "float" );
}
}
validate_info( type, name, priority ) //checked changed to match beta dump
{
keys = getarraykeys( level.vsmgr );
for ( i = 0; i < keys.size; i++ )
{
if ( type == keys[ i ] )
{
break;
}
}
/*
/#
assert( i < keys.size, "In visionset_mgr, type '" + type + "'is unknown" );
#/
*/
keys = getarraykeys( level.vsmgr[ type ].info );
for ( i = 0; i < keys.size; i++ )
{
/*
/#
assert( level.vsmgr[ type ].info[ keys[ i ] ].name != name, "In visionset_mgr of type '" + type + "': name '" + name + "' has previously been registered" );
#/
/#
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 + "'" );
#/
*/
}
}
add_sorted_name_key( type, name ) //checked changed to match beta dump
{
for ( i = 0; i < level.vsmgr[type].sorted_name_keys.size; i++ )
{
if ( name < level.vsmgr[ type ].sorted_name_keys[ i ] )
{
break;
}
}
arrayinsert( level.vsmgr[ type ].sorted_name_keys, name, i );
}
add_sorted_priority_key( type, name, priority ) //checked changed to match beta dump
{
for ( i = 0; i < level.vsmgr[type].sorted_prio_keys.size; i++ )
{
if ( priority > level.vsmgr[ type ].info[ level.vsmgr[ type ].sorted_prio_keys[ i ] ].priority )
{
break;
}
}
arrayinsert( level.vsmgr[ type ].sorted_prio_keys, name, i );
}
add_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ) //checked matches beta dump
{
self.type = type;
self.name = name;
self.version = version;
self.priority = priority;
self.lerp_step_count = lerp_step_count;
self.lerp_bit_count = getminbitcountfornum( lerp_step_count );
if ( !isDefined( ref_count_lerp_thread ) )
{
ref_count_lerp_thread = 0;
}
self.state = spawnstruct();
self.state.type = type;
self.state.name = name;
self.state.activate_per_player = activate_per_player;
self.state.lerp_thread = lerp_thread;
self.state.ref_count_lerp_thread = ref_count_lerp_thread;
self.state.players = [];
if ( ref_count_lerp_thread && !activate_per_player )
{
self.state.ref_count = 0;
}
}
onplayerconnect() //checked matches beta dump
{
for ( ;; )
{
level waittill( "connected", player );
player thread on_player_connect();
}
}
on_player_connect() //checked partially changed to match beta dump
{
self._player_entnum = self getentitynumber();
typekeys = getarraykeys( level.vsmgr );
for ( type_index = 0; type_index < typeKeys.size; type_index++ )
{
type = typekeys[ type_index ];
if ( !level.vsmgr[ type ].in_use )
{
type_index++;
}
else
{
for ( name_index = 0; name_index < level.vsmgr[type].sorted_name_keys.size; name_index++ )
{
name_key = level.vsmgr[ type ].sorted_name_keys[ name_index ];
level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ] = spawnstruct();
level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ].active = 0;
level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ].lerp = 0;
if ( level.vsmgr[ type ].info[ name_key ].state.ref_count_lerp_thread && level.vsmgr[ type ].info[ name_key ].state.activate_per_player )
{
level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ].ref_count = 0;
}
}
level.vsmgr[ type ].info[ level.vsmgr_default_info_name ].state vsmgr_set_state_active( self, 1 );
}
}
}
monitor() //checked partially changed to match beta dump
{
while ( level.vsmgr_initializing )
{
wait 0.05;
}
typekeys = getarraykeys( level.vsmgr );
while ( 1 )
{
wait 0.05;
waittillframeend;
players = get_players();
for ( type_index = 0; type_index < typeKeys.size; type_index++ )
{
type = typekeys[ type_index ];
if ( !level.vsmgr[ type ].in_use )
{
type_index++;
}
else
{
for ( player_index = 0; player_index < players.size; player_index++ )
{
/*
/#
if ( is_true( players[ player_index ].pers[ "isBot" ] ) )
{
player_index++;
continue;
#/
}
*/
update_clientfields( players[ player_index ], level.vsmgr[ type ] );
}
}
}
}
}
get_first_active_name( type_struct ) //checked partially changed to match beta dump
{
size = type_struct.sorted_prio_keys.size;
for ( prio_index = 0; prio_index < size; prio_index++ )
{
prio_key = type_struct.sorted_prio_keys[ prio_index ];
if ( type_struct.info[ prio_key ].state.players[ self._player_entnum ].active )
{
return prio_key;
}
}
return level.vsmgr_default_info_name;
}
update_clientfields( player, type_struct ) //checked changed to match beta dump
{
name = player get_first_active_name( type_struct );
player setclientfieldtoplayer( type_struct.cf_slot_name, type_struct.info[ name ].slot_index );
if ( type_struct.cf_lerp_bit_count > 1 )
{
player setclientfieldtoplayer( type_struct.cf_lerp_name, type_struct.info[ name ].state.players[ player._player_entnum ].lerp );
}
}
lerp_thread_wrapper( func, opt_param_1, opt_param_2 ) //checked matches beta dump
{
self notify( "deactivate" );
self endon( "deactivate" );
self [[ func ]]( opt_param_1, opt_param_2 );
}
lerp_thread_per_player_wrapper( func, player, opt_param_1, opt_param_2 ) //checked matches beta dump
{
player_entnum = player getentitynumber();
self notify( "deactivate" );
self endon( "deactivate" );
self.players[ player_entnum ] notify( "deactivate" );
self.players[ player_entnum ] endon( "deactivate" );
player endon( "disconnect" );
self [[ func ]]( player, opt_param_1, opt_param_2 );
}
activate_per_player( type, name, player, opt_param_1, opt_param_2 ) //checked changed to match beta dump
{
player_entnum = player getentitynumber();
state = level.vsmgr[ type ].info[ name ].state;
if ( state.ref_count_lerp_thread )
{
state.players[ player_entnum ].ref_count++;
if ( state.players[ player_entnum ].ref_count > 1 )
{
return;
}
}
if ( isDefined( state.lerp_thread ) )
{
state thread lerp_thread_per_player_wrapper( state.lerp_thread, player, opt_param_1, opt_param_2 );
}
else
{
state vsmgr_set_state_active( player, 1 );
}
}
deactivate_per_player( type, name, player ) //checked changed to match beta dump
{
player_entnum = player getentitynumber();
state = level.vsmgr[ type ].info[ name ].state;
if ( state.ref_count_lerp_thread )
{
state.players[ player_entnum ].ref_count--;
if ( state.players[ player_entnum ].ref_count > 0 )
{
return;
}
}
state vsmgr_set_state_inactive( player );
state notify( "deactivate" );
}
calc_remaining_duration_lerp( start_time, end_time ) //checked matches beta dump
{
now = getTime();
frac = float( end_time - now ) / float( end_time - start_time );
return clamp( frac, 0, 1 );
}