mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-07 17:37:50 -05:00
475 lines
13 KiB
Plaintext
475 lines
13 KiB
Plaintext
//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 );
|
|
}
|