mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-07 17:37:50 -05:00
Removed 18 Player Fixes, moved to its own repository.
This commit is contained in:
parent
0f172f59d2
commit
cf8d60b2d0
@ -1,442 +0,0 @@
|
|||||||
#include maps/mp/_utility;
|
|
||||||
#include common_scripts/utility;
|
|
||||||
|
|
||||||
init()
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
if ( level.createfx_enabled )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
self vsmgr_set_state_active( player, 1 );
|
|
||||||
wait timeout;
|
|
||||||
deactivate_per_player( self.type, self.name, player );
|
|
||||||
}
|
|
||||||
|
|
||||||
vsmgr_duration_lerp_thread( duration, max_duration )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
keys = getarraykeys( level.vsmgr );
|
|
||||||
for ( i = 0; i < keys.size; i++ )
|
|
||||||
{
|
|
||||||
if ( type == keys[ i ] )
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
add_sorted_name_key( type, name )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
for ( ;; )
|
|
||||||
{
|
|
||||||
level waittill( "connected", player );
|
|
||||||
player thread on_player_connect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
on_player_connect()
|
|
||||||
{
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
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++ )
|
|
||||||
{
|
|
||||||
update_clientfields( players[ player_index ], level.vsmgr[ type ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get_first_active_name( type_struct )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
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 )
|
|
||||||
{
|
|
||||||
now = getTime();
|
|
||||||
frac = float( end_time - now ) / float( end_time - start_time );
|
|
||||||
return clamp( frac, 0, 1 );
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,805 +0,0 @@
|
|||||||
#include maps/mp/_visionset_mgr;
|
|
||||||
#include maps/mp/zombies/_zm;
|
|
||||||
#include maps/mp/zombies/_zm_equipment;
|
|
||||||
#include maps/mp/zombies/_zm_weap_cymbal_monkey;
|
|
||||||
#include maps/mp/zombies/_zm_weapons;
|
|
||||||
#include maps/mp/zombies/_zm_clone;
|
|
||||||
#include maps/mp/zombies/_zm_chugabud;
|
|
||||||
#include maps/mp/zombies/_zm_laststand;
|
|
||||||
#include maps/mp/zombies/_zm_utility;
|
|
||||||
#include common_scripts/utility;
|
|
||||||
#include maps/mp/_utility;
|
|
||||||
#include maps/mp/zombies/_zm_perks;
|
|
||||||
|
|
||||||
init() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
level.chugabud_laststand_func = ::chugabud_laststand;
|
|
||||||
level thread chugabud_hostmigration();
|
|
||||||
level._effect[ "chugabud_revive_fx" ] = loadfx( "weapon/quantum_bomb/fx_player_position_effect" );
|
|
||||||
level._effect[ "chugabud_bleedout_fx" ] = loadfx( "weapon/quantum_bomb/fx_player_position_effect" );
|
|
||||||
add_custom_limited_weapon_check( ::is_weapon_available_in_chugabud_corpse );
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabug_precache() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_player_init() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_laststand() //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
self endon( "player_suicide" );
|
|
||||||
self endon( "disconnect" );
|
|
||||||
self endon( "chugabud_bleedout" );
|
|
||||||
self maps/mp/zombies/_zm_laststand::increment_downed_stat();
|
|
||||||
self.ignore_insta_kill = 1;
|
|
||||||
self.health = self.maxhealth;
|
|
||||||
self maps/mp/zombies/_zm_chugabud::chugabud_save_loadout();
|
|
||||||
self maps/mp/zombies/_zm_chugabud::chugabud_fake_death();
|
|
||||||
wait 3;
|
|
||||||
if ( is_true( self.insta_killed ) || isDefined( self.disable_chugabud_corpse ) )
|
|
||||||
{
|
|
||||||
create_corpse = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
create_corpse = 1;
|
|
||||||
}
|
|
||||||
if ( create_corpse == 1 )
|
|
||||||
{
|
|
||||||
if ( isDefined( level._chugabug_reject_corpse_override_func ) )
|
|
||||||
{
|
|
||||||
reject_corpse = self [[ level._chugabug_reject_corpse_override_func ]]( self.origin );
|
|
||||||
if ( reject_corpse )
|
|
||||||
{
|
|
||||||
create_corpse = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( create_corpse == 1 )
|
|
||||||
{
|
|
||||||
self thread activate_chugabud_effects_and_audio();
|
|
||||||
corpse = self chugabud_spawn_corpse();
|
|
||||||
corpse thread chugabud_corpse_revive_icon( self );
|
|
||||||
self.e_chugabud_corpse = corpse;
|
|
||||||
corpse thread chugabud_corpse_cleanup_on_spectator( self );
|
|
||||||
if ( isDefined( level.whos_who_client_setup ) )
|
|
||||||
{
|
|
||||||
corpse setclientfield( "clientfield_whos_who_clone_glow_shader", 1 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self chugabud_fake_revive();
|
|
||||||
wait 0.1;
|
|
||||||
self.ignore_insta_kill = undefined;
|
|
||||||
self.disable_chugabud_corpse = undefined;
|
|
||||||
if ( create_corpse == 0 )
|
|
||||||
{
|
|
||||||
self notify( "chugabud_effects_cleanup" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bleedout_time = getDvarFloat( "player_lastStandBleedoutTime" );
|
|
||||||
self thread chugabud_bleed_timeout( bleedout_time, corpse );
|
|
||||||
self thread chugabud_handle_multiple_instances( corpse );
|
|
||||||
corpse waittill( "player_revived", e_reviver );
|
|
||||||
if ( isDefined( e_reviver ) && e_reviver == self )
|
|
||||||
{
|
|
||||||
self notify( "whos_who_self_revive" );
|
|
||||||
}
|
|
||||||
self perk_abort_drinking( 0.1 );
|
|
||||||
self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 );
|
|
||||||
self setorigin( corpse.origin );
|
|
||||||
self setplayerangles( corpse.angles );
|
|
||||||
if ( self player_is_in_laststand() )
|
|
||||||
{
|
|
||||||
self thread chugabud_laststand_cleanup( corpse, "player_revived" );
|
|
||||||
self enableweaponcycling();
|
|
||||||
self enableoffhandweapons();
|
|
||||||
self auto_revive( self, 1 );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self chugabud_laststand_cleanup( corpse, undefined );
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_laststand_cleanup( corpse, str_notify ) //checked matches cerberus output
|
|
||||||
{
|
|
||||||
if ( isDefined( str_notify ) )
|
|
||||||
{
|
|
||||||
self waittill( str_notify );
|
|
||||||
}
|
|
||||||
self chugabud_give_loadout();
|
|
||||||
self chugabud_corpse_cleanup( corpse, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_bleed_timeout( delay, corpse ) //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
self endon( "player_suicide" );
|
|
||||||
self endon( "disconnect" );
|
|
||||||
corpse endon( "death" );
|
|
||||||
wait delay;
|
|
||||||
if ( isDefined( corpse.revivetrigger ) )
|
|
||||||
{
|
|
||||||
while ( corpse.revivetrigger.beingrevived )
|
|
||||||
{
|
|
||||||
wait 0.01;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( isDefined( self.loadout.perks ) && flag( "solo_game" ) )
|
|
||||||
{
|
|
||||||
for ( i = 0; i < self.loadout.perks.size; i++ )
|
|
||||||
{
|
|
||||||
perk = self.loadout.perks[ i ];
|
|
||||||
if ( perk == "specialty_quickrevive" )
|
|
||||||
{
|
|
||||||
arrayremovevalue( self.loadout.perks, self.loadout.perks[ i ] );
|
|
||||||
corpse notify( "player_revived" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self chugabud_corpse_cleanup( corpse, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_corpse_cleanup( corpse, was_revived ) //checked matches cerberus output
|
|
||||||
{
|
|
||||||
self notify( "chugabud_effects_cleanup" );
|
|
||||||
if ( was_revived )
|
|
||||||
{
|
|
||||||
playsoundatposition( "evt_ww_appear", corpse.origin );
|
|
||||||
playfx( level._effect[ "chugabud_revive_fx" ], corpse.origin );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
playsoundatposition( "evt_ww_disappear", corpse.origin );
|
|
||||||
playfx( level._effect[ "chugabud_bleedout_fx" ], corpse.origin );
|
|
||||||
self notify( "chugabud_bleedout" );
|
|
||||||
}
|
|
||||||
if ( isDefined( corpse.revivetrigger ) )
|
|
||||||
{
|
|
||||||
corpse notify( "stop_revive_trigger" );
|
|
||||||
corpse.revivetrigger delete();
|
|
||||||
corpse.revivetrigger = undefined;
|
|
||||||
}
|
|
||||||
if ( isDefined( corpse.revive_hud_elem ) )
|
|
||||||
{
|
|
||||||
corpse.revive_hud_elem destroy();
|
|
||||||
corpse.revive_hud_elem = undefined;
|
|
||||||
}
|
|
||||||
self.loadout = undefined;
|
|
||||||
wait 0.1;
|
|
||||||
corpse delete();
|
|
||||||
self.e_chugabud_corpse = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_handle_multiple_instances( corpse ) //checked matches cerberus output
|
|
||||||
{
|
|
||||||
corpse endon( "death" );
|
|
||||||
self waittill( "perk_chugabud_activated" );
|
|
||||||
self chugabud_corpse_cleanup( corpse, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_spawn_corpse() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
corpse = maps/mp/zombies/_zm_clone::spawn_player_clone( self, self.origin, undefined, self.whos_who_shader );
|
|
||||||
corpse.angles = self.angles;
|
|
||||||
corpse maps/mp/zombies/_zm_clone::clone_give_weapon( "m1911_zm" );
|
|
||||||
corpse maps/mp/zombies/_zm_clone::clone_animate( "laststand" );
|
|
||||||
corpse.revive_hud = self chugabud_revive_hud_create();
|
|
||||||
corpse thread maps/mp/zombies/_zm_laststand::revive_trigger_spawn();
|
|
||||||
return corpse;
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_revive_hud_create() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
self.revive_hud = newclienthudelem( self );
|
|
||||||
self.revive_hud.alignx = "center";
|
|
||||||
self.revive_hud.aligny = "middle";
|
|
||||||
self.revive_hud.horzalign = "center";
|
|
||||||
self.revive_hud.vertalign = "bottom";
|
|
||||||
self.revive_hud.y = -50;
|
|
||||||
self.revive_hud.foreground = 1;
|
|
||||||
self.revive_hud.font = "default";
|
|
||||||
self.revive_hud.fontscale = 1.5;
|
|
||||||
self.revive_hud.alpha = 0;
|
|
||||||
self.revive_hud.color = ( 1, 1, 1 );
|
|
||||||
self.revive_hud settext( "" );
|
|
||||||
return self.revive_hud;
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_save_loadout() //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
primaries = self getweaponslistprimaries();
|
|
||||||
currentweapon = self getcurrentweapon();
|
|
||||||
self.loadout = spawnstruct();
|
|
||||||
self.loadout.player = self;
|
|
||||||
self.loadout.weapons = [];
|
|
||||||
self.loadout.score = self.score;
|
|
||||||
self.loadout.current_weapon = -1;
|
|
||||||
index = 0;
|
|
||||||
foreach ( weapon in primaries )
|
|
||||||
{
|
|
||||||
logline1 = "weapon: " + weapon + "\n";
|
|
||||||
logprint( logline1 );
|
|
||||||
self.loadout.weapons[ index ] = maps/mp/zombies/_zm_weapons::get_player_weapondata( self, weapon );
|
|
||||||
if ( weapon == currentweapon || self.loadout.weapons[ index ][ "alt_name" ] == currentweapon )
|
|
||||||
{
|
|
||||||
self.loadout.current_weapon = index;
|
|
||||||
}
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
self.loadout.equipment = self get_player_equipment();
|
|
||||||
if ( isDefined( self.loadout.equipment ) )
|
|
||||||
{
|
|
||||||
self equipment_take( self.loadout.equipment );
|
|
||||||
}
|
|
||||||
self.loadout save_weapons_for_chugabud( self );
|
|
||||||
if ( self hasweapon( "claymore_zm" ) )
|
|
||||||
{
|
|
||||||
self.loadout.hasclaymore = 1;
|
|
||||||
self.loadout.claymoreclip = self getweaponammoclip( "claymore_zm" );
|
|
||||||
}
|
|
||||||
self.loadout.perks = chugabud_save_perks( self );
|
|
||||||
self chugabud_save_grenades();
|
|
||||||
if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() )
|
|
||||||
{
|
|
||||||
self.loadout.zombie_cymbal_monkey_count = self getweaponammoclip( "cymbal_monkey_zm" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_save_grenades() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
if ( self hasweapon( "emp_grenade_zm" ) )
|
|
||||||
{
|
|
||||||
self.loadout.hasemp = 1;
|
|
||||||
self.loadout.empclip = self getweaponammoclip( "emp_grenade_zm" );
|
|
||||||
}
|
|
||||||
lethal_grenade = self get_player_lethal_grenade();
|
|
||||||
if ( self hasweapon( lethal_grenade ) )
|
|
||||||
{
|
|
||||||
self.loadout.lethal_grenade = lethal_grenade;
|
|
||||||
self.loadout.lethal_grenade_count = self getweaponammoclip( lethal_grenade );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
self.loadout.lethal_grenade = undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_give_loadout() //checked partially changed to match cerberus output continues in for loops bad see the github for more info
|
|
||||||
{
|
|
||||||
self takeallweapons();
|
|
||||||
loadout = self.loadout;
|
|
||||||
primaries = self getweaponslistprimaries();
|
|
||||||
if ( loadout.weapons.size > 1 || primaries.size > 1 )
|
|
||||||
{
|
|
||||||
foreach ( weapon in primaries )
|
|
||||||
{
|
|
||||||
self takeweapon( weapon );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i = 0;
|
|
||||||
while ( i < loadout.weapons.size )
|
|
||||||
{
|
|
||||||
logline1 = "loadout.weapons[ " + i + " ][ name ] " + loadout.weapons[ i ][ "name" ] + "\n";
|
|
||||||
logprint( logline1 );
|
|
||||||
if ( !isDefined( loadout.weapons[ i ] ) )
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ( loadout.weapons[ i ][ "name" ] == "none" )
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
self maps/mp/zombies/_zm_weapons::weapondata_give( loadout.weapons[ i ] );
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if ( loadout.current_weapon >= 0 && isDefined( loadout.weapons[ loadout.current_weapon ][ "name" ] ) )
|
|
||||||
{
|
|
||||||
self switchtoweapon( loadout.weapons[ loadout.current_weapon ][ "name" ] );
|
|
||||||
}
|
|
||||||
self giveweapon( "knife_zm" );
|
|
||||||
self maps/mp/zombies/_zm_equipment::equipment_give( self.loadout.equipment );
|
|
||||||
loadout restore_weapons_for_chugabud( self );
|
|
||||||
self chugabud_restore_claymore();
|
|
||||||
self.score = loadout.score;
|
|
||||||
self.pers[ "score" ] = loadout.score;
|
|
||||||
perk_array = maps/mp/zombies/_zm_perks::get_perk_array( 1 );
|
|
||||||
for ( i = 0; i < perk_array.size; i++ )
|
|
||||||
{
|
|
||||||
perk = perk_array[ i ];
|
|
||||||
self unsetperk( perk );
|
|
||||||
self.num_perks--;
|
|
||||||
self set_perk_clientfield( perk, 0 );
|
|
||||||
}
|
|
||||||
if ( isDefined( loadout.perks ) && loadout.perks.size > 0 )
|
|
||||||
{
|
|
||||||
i = 0;
|
|
||||||
while ( i < loadout.perks.size )
|
|
||||||
{
|
|
||||||
if ( self hasperk( loadout.perks[ i ] ) )
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ( loadout.perks[ i ] == "specialty_quickrevive" && flag( "solo_game" ) )
|
|
||||||
{
|
|
||||||
level.solo_game_free_player_quickrevive = 1;
|
|
||||||
}
|
|
||||||
if ( loadout.perks[ i ] == "specialty_finalstand" )
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
maps/mp/zombies/_zm_perks::give_perk( loadout.perks[ i ] );
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self chugabud_restore_grenades();
|
|
||||||
if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() )
|
|
||||||
{
|
|
||||||
if ( loadout.zombie_cymbal_monkey_count )
|
|
||||||
{
|
|
||||||
self maps/mp/zombies/_zm_weap_cymbal_monkey::player_give_cymbal_monkey();
|
|
||||||
self setweaponammoclip( "cymbal_monkey_zm", loadout.zombie_cymbal_monkey_count );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_restore_grenades() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
if ( is_true( self.loadout.hasemp ) )
|
|
||||||
{
|
|
||||||
self giveweapon( "emp_grenade_zm" );
|
|
||||||
self setweaponammoclip( "emp_grenade_zm", self.loadout.empclip );
|
|
||||||
}
|
|
||||||
if ( isDefined( self.loadout.lethal_grenade ) )
|
|
||||||
{
|
|
||||||
self giveweapon( self.loadout.lethal_grenade );
|
|
||||||
self setweaponammoclip( self.loadout.lethal_grenade, self.loadout.lethal_grenade_count );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_restore_claymore() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
if ( is_true( self.loadout.hasclaymore ) && !self hasweapon( "claymore_zm" ) )
|
|
||||||
{
|
|
||||||
self giveweapon( "claymore_zm" );
|
|
||||||
self set_player_placeable_mine( "claymore_zm" );
|
|
||||||
self setactionslot( 4, "weapon", "claymore_zm" );
|
|
||||||
self setweaponammoclip( "claymore_zm", self.loadout.claymoreclip );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_fake_death() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
level notify( "fake_death" );
|
|
||||||
self notify( "fake_death" );
|
|
||||||
self takeallweapons();
|
|
||||||
self allowstand( 0 );
|
|
||||||
self allowcrouch( 0 );
|
|
||||||
self allowprone( 1 );
|
|
||||||
self.ignoreme = 1;
|
|
||||||
self enableinvulnerability();
|
|
||||||
wait 0.1;
|
|
||||||
self freezecontrols( 1 );
|
|
||||||
wait 0.9;
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_fake_revive() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
level notify( "fake_revive" );
|
|
||||||
self notify( "fake_revive" );
|
|
||||||
playsoundatposition( "evt_ww_disappear", self.origin );
|
|
||||||
playfx( level._effect[ "chugabud_revive_fx" ], self.origin );
|
|
||||||
spawnpoint = chugabud_get_spawnpoint();
|
|
||||||
if ( isDefined( level._chugabud_post_respawn_override_func ) )
|
|
||||||
{
|
|
||||||
self [[ level._chugabud_post_respawn_override_func ]]( spawnpoint.origin );
|
|
||||||
}
|
|
||||||
if ( isDefined( level.chugabud_force_corpse_position ) )
|
|
||||||
{
|
|
||||||
if ( isDefined( self.e_chugabud_corpse ) )
|
|
||||||
{
|
|
||||||
self.e_chugabud_corpse forceteleport( level.chugabud_force_corpse_position );
|
|
||||||
}
|
|
||||||
level.chugabud_force_corpse_position = undefined;
|
|
||||||
}
|
|
||||||
if ( isDefined( level.chugabud_force_player_position ) )
|
|
||||||
{
|
|
||||||
spawnpoint.origin = level.chugabud_force_player_position;
|
|
||||||
level.chugabud_force_player_position = undefined;
|
|
||||||
}
|
|
||||||
self setorigin( spawnpoint.origin );
|
|
||||||
self setplayerangles( spawnpoint.angles );
|
|
||||||
playsoundatposition( "evt_ww_appear", spawnpoint.origin );
|
|
||||||
playfx( level._effect[ "chugabud_revive_fx" ], spawnpoint.origin );
|
|
||||||
self allowstand( 1 );
|
|
||||||
self allowcrouch( 1 );
|
|
||||||
self allowprone( 1 );
|
|
||||||
self.ignoreme = 0;
|
|
||||||
self setstance( "stand" );
|
|
||||||
self freezecontrols( 0 );
|
|
||||||
self giveweapon( "knife_zm" );
|
|
||||||
self give_start_weapon( 1 );
|
|
||||||
self.score = self.loadout.score;
|
|
||||||
self.pers[ "score" ] = self.loadout.score;
|
|
||||||
self giveweapon( "frag_grenade_zm" );
|
|
||||||
self setweaponammoclip( "frag_grenade_zm", 2 );
|
|
||||||
self chugabud_restore_claymore();
|
|
||||||
wait 1;
|
|
||||||
self disableinvulnerability();
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_get_spawnpoint() //checked partially changed to match cerberus output nested foreach is probably bad
|
|
||||||
{
|
|
||||||
spawnpoint = undefined;
|
|
||||||
if ( get_chugabug_spawn_point_from_nodes( self.origin, 500, 700, 64, 1 ) )
|
|
||||||
{
|
|
||||||
spawnpoint = level.chugabud_spawn_struct;
|
|
||||||
}
|
|
||||||
if ( !isDefined( spawnpoint ) )
|
|
||||||
{
|
|
||||||
if ( get_chugabug_spawn_point_from_nodes( self.origin, 100, 400, 64, 1 ) )
|
|
||||||
{
|
|
||||||
spawnpoint = level.chugabud_spawn_struct;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( !isDefined( spawnpoint ) )
|
|
||||||
{
|
|
||||||
if ( get_chugabug_spawn_point_from_nodes( self.origin, 50, 400, 256, 0 ) )
|
|
||||||
{
|
|
||||||
spawnpoint = level.chugabud_spawn_struct;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( !isDefined( spawnpoint ) )
|
|
||||||
{
|
|
||||||
spawnpoint = maps/mp/zombies/_zm::check_for_valid_spawn_near_team( self, 1 );
|
|
||||||
}
|
|
||||||
if ( !isDefined( spawnpoint ) )
|
|
||||||
{
|
|
||||||
match_string = "";
|
|
||||||
location = level.scr_zm_map_start_location;
|
|
||||||
if ( (location == "default" || location == "" ) && isdefined( level.default_start_location ) )
|
|
||||||
{
|
|
||||||
location = level.default_start_location;
|
|
||||||
}
|
|
||||||
match_string = level.scr_zm_ui_gametype + "_" + location;
|
|
||||||
spawnpoints = [];
|
|
||||||
structs = getstructarray( "initial_spawn", "script_noteworthy" );
|
|
||||||
if ( isdefined( structs ) )
|
|
||||||
{
|
|
||||||
foreach ( struct in structs )
|
|
||||||
{
|
|
||||||
if ( isdefined( struct.script_string ) )
|
|
||||||
{
|
|
||||||
tokens = strtok( struct.script_string, " " );
|
|
||||||
i = 0;
|
|
||||||
while ( i < tokens.size )
|
|
||||||
{
|
|
||||||
if ( tokens[ i ] == match_string )
|
|
||||||
{
|
|
||||||
spawnpoints[ spawnpoints.size ] = struct;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( !isDefined( spawnpoints ) || spawnpoints.size == 0 )
|
|
||||||
{
|
|
||||||
spawnpoints = getstructarray( "initial_spawn_points", "targetname" );
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
/#
|
|
||||||
assert( isDefined( spawnpoints ), "Could not find initial spawn points!" );
|
|
||||||
#/
|
|
||||||
*/
|
|
||||||
spawnpoint = maps/mp/zombies/_zm::getfreespawnpoint( spawnpoints, self );
|
|
||||||
}
|
|
||||||
return spawnpoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_chugabug_spawn_point_from_nodes( v_origin, min_radius, max_radius, max_height, ignore_targetted_nodes ) //checked partially changed to match cerberus output changed at own discretion
|
|
||||||
{
|
|
||||||
if ( !isDefined( level.chugabud_spawn_struct ) )
|
|
||||||
{
|
|
||||||
level.chugabud_spawn_struct = spawnstruct();
|
|
||||||
}
|
|
||||||
found_node = undefined;
|
|
||||||
a_nodes = getnodesinradiussorted( v_origin, max_radius, min_radius, max_height, "pathnodes" );
|
|
||||||
if ( isDefined( a_nodes ) && a_nodes.size > 0 )
|
|
||||||
{
|
|
||||||
a_player_volumes = getentarray( "player_volume", "script_noteworthy" );
|
|
||||||
index = a_nodes.size - 1;
|
|
||||||
i = index;
|
|
||||||
while ( i >= 0 )
|
|
||||||
{
|
|
||||||
n_node = a_nodes[ i ];
|
|
||||||
if ( ignore_targetted_nodes == 1 )
|
|
||||||
{
|
|
||||||
if ( isDefined( n_node.target ) )
|
|
||||||
{
|
|
||||||
i--;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( !positionwouldtelefrag( n_node.origin ) )
|
|
||||||
{
|
|
||||||
if ( maps/mp/zombies/_zm_utility::check_point_in_enabled_zone( n_node.origin, 1, a_player_volumes ) )
|
|
||||||
{
|
|
||||||
v_start = ( n_node.origin[ 0 ], n_node.origin[ 1 ], n_node.origin[ 2 ] + 30 );
|
|
||||||
v_end = ( n_node.origin[ 0 ], n_node.origin[ 1 ], n_node.origin[ 2 ] - 30 );
|
|
||||||
trace = bullettrace( v_start, v_end, 0, undefined );
|
|
||||||
if ( trace[ "fraction" ] < 1 )
|
|
||||||
{
|
|
||||||
override_abort = 0;
|
|
||||||
if ( isDefined( level._chugabud_reject_node_override_func ) )
|
|
||||||
{
|
|
||||||
override_abort = [[ level._chugabud_reject_node_override_func ]]( v_origin, n_node );
|
|
||||||
}
|
|
||||||
if ( !override_abort )
|
|
||||||
{
|
|
||||||
found_node = n_node;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( isDefined( found_node ) )
|
|
||||||
{
|
|
||||||
level.chugabud_spawn_struct.origin = found_node.origin;
|
|
||||||
v_dir = vectornormalize( v_origin - level.chugabud_spawn_struct.origin );
|
|
||||||
level.chugabud_spawn_struct.angles = vectorToAngles( v_dir );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
force_corpse_respawn_position( forced_corpse_position ) //checked matches cerberus output
|
|
||||||
{
|
|
||||||
level.chugabud_force_corpse_position = forced_corpse_position;
|
|
||||||
}
|
|
||||||
|
|
||||||
force_player_respawn_position( forced_player_position ) //checked matches cerberus output
|
|
||||||
{
|
|
||||||
level.chugabud_force_player_position = forced_player_position;
|
|
||||||
}
|
|
||||||
|
|
||||||
save_weapons_for_chugabud( player ) //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
self.chugabud_melee_weapons = [];
|
|
||||||
for ( i = 0; i < level._melee_weapons.size; i++ )
|
|
||||||
{
|
|
||||||
self save_weapon_for_chugabud( player, level._melee_weapons[ i ].weapon_name );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
save_weapon_for_chugabud( player, weapon_name ) //checked matches cerberus output
|
|
||||||
{
|
|
||||||
if ( player hasweapon( weapon_name ) )
|
|
||||||
{
|
|
||||||
self.chugabud_melee_weapons[ weapon_name ] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
restore_weapons_for_chugabud( player ) //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
for ( i = 0; i < level._melee_weapons.size; i++ )
|
|
||||||
{
|
|
||||||
self restore_weapon_for_chugabud( player, level._melee_weapons[ i ].weapon_name );
|
|
||||||
}
|
|
||||||
self.chugabud_melee_weapons = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
restore_weapon_for_chugabud( player, weapon_name ) //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
if ( !isDefined( weapon_name ) || !isDefined( self.chugabud_melee_weapons ) || !isDefined( self.chugabud_melee_weapons[ weapon_name ] ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( is_true( self.chugabud_melee_weapons[ weapon_name ] ) )
|
|
||||||
{
|
|
||||||
player giveweapon( weapon_name );
|
|
||||||
player set_player_melee_weapon( weapon_name );
|
|
||||||
self.chugabud_melee_weapons[ weapon_name ] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_save_perks( ent ) //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
perk_array = ent get_perk_array( 1 );
|
|
||||||
foreach ( perk in perk_array )
|
|
||||||
{
|
|
||||||
ent unsetperk( perk );
|
|
||||||
}
|
|
||||||
return perk_array;
|
|
||||||
}
|
|
||||||
|
|
||||||
playchugabudtimeraudio() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
self endon( "chugabud_grabbed" );
|
|
||||||
self endon( "chugabud_timedout" );
|
|
||||||
player = self.player;
|
|
||||||
self thread playchugabudtimerout( player );
|
|
||||||
while ( 1 )
|
|
||||||
{
|
|
||||||
player playsoundtoplayer( "zmb_chugabud_timer_count", player );
|
|
||||||
wait 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
playchugabudtimerout( player ) //checked matches cerberus output
|
|
||||||
{
|
|
||||||
self endon( "chugabud_grabbed" );
|
|
||||||
self waittill( "chugabud_timedout" );
|
|
||||||
player playsoundtoplayer( "zmb_chugabud_timer_out", player );
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_hostmigration() //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
level endon( "end_game" );
|
|
||||||
level notify( "chugabud_hostmigration" );
|
|
||||||
level endon( "chugabud_hostmigration" );
|
|
||||||
while ( 1 )
|
|
||||||
{
|
|
||||||
level waittill( "host_migration_end" );
|
|
||||||
chugabuds = getentarray( "player_chugabud_model", "script_noteworthy" );
|
|
||||||
foreach ( model in chugabuds )
|
|
||||||
{
|
|
||||||
playfxontag( level._effect[ "powerup_on" ], model, "tag_origin" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
player_revived_cleanup_chugabud_corpse() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
player_has_chugabud_corpse() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
if ( isDefined( self.e_chugabud_corpse ) )
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
is_weapon_available_in_chugabud_corpse( weapon, player_to_check ) //checked partially changed to match cerberus output
|
|
||||||
{
|
|
||||||
count = 0;
|
|
||||||
upgradedweapon = weapon;
|
|
||||||
if ( isDefined( level.zombie_weapons[ weapon ] ) && isDefined( level.zombie_weapons[ weapon ].upgrade_name ) )
|
|
||||||
{
|
|
||||||
upgradedweapon = level.zombie_weapons[ weapon ].upgrade_name;
|
|
||||||
}
|
|
||||||
players = getplayers();
|
|
||||||
if ( isDefined( players ) )
|
|
||||||
{
|
|
||||||
player_index = 0;
|
|
||||||
while ( player_index < players.size )
|
|
||||||
{
|
|
||||||
player = players[ player_index ];
|
|
||||||
if ( isDefined( player_to_check ) && player != player_to_check )
|
|
||||||
{
|
|
||||||
player_index++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ( player player_has_chugabud_corpse() )
|
|
||||||
{
|
|
||||||
if ( isDefined( player.loadout ) && isDefined( player.loadout.weapons ) )
|
|
||||||
{
|
|
||||||
for ( i = 0; i < player.loadout.weapons.size; i++ )
|
|
||||||
{
|
|
||||||
chugabud_weapon = player.loadout.weapons[ i ];
|
|
||||||
if ( isDefined( chugabud_weapon ) && chugabud_weapon[ "name" ] == weapon || chugabud_weapon[ "name" ] == upgradedweapon )
|
|
||||||
{
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
player_index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_corpse_cleanup_on_spectator( player ) //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
self endon( "death" );
|
|
||||||
player endon( "disconnect" );
|
|
||||||
while ( 1 )
|
|
||||||
{
|
|
||||||
if ( player.sessionstate == "spectator" )
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
wait 0.01;
|
|
||||||
}
|
|
||||||
player chugabud_corpse_cleanup( self, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
chugabud_corpse_revive_icon( player ) //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
self endon( "death" );
|
|
||||||
height_offset = 30;
|
|
||||||
index = player.clientid;
|
|
||||||
hud_elem = newhudelem();
|
|
||||||
self.revive_hud_elem = hud_elem;
|
|
||||||
hud_elem.x = self.origin[ 0 ];
|
|
||||||
hud_elem.y = self.origin[ 1 ];
|
|
||||||
hud_elem.z = self.origin[ 2 ] + height_offset;
|
|
||||||
hud_elem.alpha = 1;
|
|
||||||
hud_elem.archived = 1;
|
|
||||||
hud_elem setshader( "waypoint_revive", 5, 5 );
|
|
||||||
hud_elem setwaypoint( 1 );
|
|
||||||
hud_elem.hidewheninmenu = 1;
|
|
||||||
hud_elem.immunetodemogamehudsettings = 1;
|
|
||||||
while ( 1 )
|
|
||||||
{
|
|
||||||
if ( !isDefined( self.revive_hud_elem ) )
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
hud_elem.x = self.origin[ 0 ];
|
|
||||||
hud_elem.y = self.origin[ 1 ];
|
|
||||||
hud_elem.z = self.origin[ 2 ] + height_offset;
|
|
||||||
wait 0.01;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
activate_chugabud_effects_and_audio() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
if ( isDefined( level.whos_who_client_setup ) )
|
|
||||||
{
|
|
||||||
if ( !isDefined( self.whos_who_effects_active ) )
|
|
||||||
{
|
|
||||||
if ( isDefined( level.chugabud_shellshock ) )
|
|
||||||
{
|
|
||||||
self shellshock( "whoswho", 60 );
|
|
||||||
}
|
|
||||||
if ( isDefined( level.vsmgr_prio_visionset_zm_whos_who ) )
|
|
||||||
{
|
|
||||||
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_whos_who", self );
|
|
||||||
}
|
|
||||||
self setclientfieldtoplayer( "clientfield_whos_who_audio", 1 );
|
|
||||||
self setclientfieldtoplayer( "clientfield_whos_who_filter", 1 );
|
|
||||||
self.whos_who_effects_active = 1;
|
|
||||||
self thread deactivate_chugabud_effects_and_audio();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deactivate_chugabud_effects_and_audio() //checked matches cerberus output
|
|
||||||
{
|
|
||||||
self waittill_any( "death", "chugabud_effects_cleanup" );
|
|
||||||
if ( isDefined( level.whos_who_client_setup ) )
|
|
||||||
{
|
|
||||||
if ( isDefined( self.whos_who_effects_active ) && self.whos_who_effects_active == 1 )
|
|
||||||
{
|
|
||||||
if ( isDefined( level.chugabud_shellshock ) )
|
|
||||||
{
|
|
||||||
self stopshellshock();
|
|
||||||
}
|
|
||||||
if ( isDefined( level.vsmgr_prio_visionset_zm_whos_who ) )
|
|
||||||
{
|
|
||||||
maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_whos_who", self );
|
|
||||||
}
|
|
||||||
self setclientfieldtoplayer( "clientfield_whos_who_audio", 0 );
|
|
||||||
self setclientfieldtoplayer( "clientfield_whos_who_filter", 0 );
|
|
||||||
}
|
|
||||||
self.whos_who_effects_active = undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,604 +0,0 @@
|
|||||||
#include maps/mp/zombies/_zm_ai_basic;
|
|
||||||
#include maps/mp/_demo;
|
|
||||||
#include maps/mp/zombies/_zm_perks;
|
|
||||||
#include maps/mp/zombies/_zm_utility;
|
|
||||||
#include maps/mp/_utility;
|
|
||||||
#include common_scripts/utility;
|
|
||||||
|
|
||||||
init()
|
|
||||||
{
|
|
||||||
if ( !isDefined( level.powered_items ) )
|
|
||||||
{
|
|
||||||
level.powered_items = [];
|
|
||||||
}
|
|
||||||
if ( !isDefined( level.local_power ) )
|
|
||||||
{
|
|
||||||
level.local_power = [];
|
|
||||||
}
|
|
||||||
thread standard_powered_items();
|
|
||||||
}
|
|
||||||
|
|
||||||
watch_global_power()
|
|
||||||
{
|
|
||||||
while ( 1 )
|
|
||||||
{
|
|
||||||
flag_wait( "power_on" );
|
|
||||||
level thread set_global_power( 1 );
|
|
||||||
flag_waitopen( "power_on" );
|
|
||||||
level thread set_global_power( 0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
standard_powered_items()
|
|
||||||
{
|
|
||||||
flag_wait( "start_zombie_round_logic" );
|
|
||||||
vending_triggers = getentarray( "zombie_vending", "targetname" );
|
|
||||||
i = 0;
|
|
||||||
while ( i < vending_triggers.size)
|
|
||||||
{
|
|
||||||
if ( vending_triggers[ i ].script_noteworthy == "specialty_weapupgrade" )
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( vending_triggers[ i ].script_noteworthy );
|
|
||||||
add_powered_item( ::perk_power_on, ::perk_power_off, ::perk_range, ::cost_low_if_local, 0, powered_on, vending_triggers[ i ] );
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
pack_a_punch = getentarray( "specialty_weapupgrade", "script_noteworthy" );
|
|
||||||
foreach ( trigger in pack_a_punch )
|
|
||||||
{
|
|
||||||
powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( trigger.script_noteworthy );
|
|
||||||
trigger.powered = add_powered_item( ::pap_power_on, ::pap_power_off, ::pap_range, ::cost_low_if_local, 0, powered_on, trigger );
|
|
||||||
}
|
|
||||||
zombie_doors = getentarray( "zombie_door", "targetname" );
|
|
||||||
foreach ( door in zombie_doors )
|
|
||||||
{
|
|
||||||
if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "electric_door" )
|
|
||||||
{
|
|
||||||
add_powered_item( ::door_power_on, ::door_power_off, ::door_range, ::cost_door, 0, 0, door );
|
|
||||||
}
|
|
||||||
if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" )
|
|
||||||
{
|
|
||||||
power_sources = 0;
|
|
||||||
if ( !is_true( level.power_local_doors_globally ) )
|
|
||||||
{
|
|
||||||
power_sources = 1;
|
|
||||||
}
|
|
||||||
add_powered_item( ::door_local_power_on, ::door_local_power_off, ::door_range, ::cost_door, power_sources, 0, door );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
thread watch_global_power();
|
|
||||||
}
|
|
||||||
|
|
||||||
add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target )
|
|
||||||
{
|
|
||||||
powered = spawnstruct();
|
|
||||||
powered.power_on_func = power_on_func;
|
|
||||||
powered.power_off_func = power_off_func;
|
|
||||||
powered.range_func = range_func;
|
|
||||||
powered.power_sources = power_sources;
|
|
||||||
powered.self_powered = self_powered;
|
|
||||||
powered.target = target;
|
|
||||||
powered.cost_func = cost_func;
|
|
||||||
powered.power = self_powered;
|
|
||||||
powered.powered_count = self_powered;
|
|
||||||
powered.depowered_count = 0;
|
|
||||||
if ( !isDefined( level.powered_items ) )
|
|
||||||
{
|
|
||||||
level.powered_items = [];
|
|
||||||
}
|
|
||||||
level.powered_items[ level.powered_items.size ] = powered;
|
|
||||||
return powered;
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_powered_item( powered )
|
|
||||||
{
|
|
||||||
arrayremovevalue( level.powered_items, powered, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
add_temp_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target )
|
|
||||||
{
|
|
||||||
powered = add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target );
|
|
||||||
if ( isDefined( level.local_power ) )
|
|
||||||
{
|
|
||||||
foreach ( localpower in level.local_power )
|
|
||||||
{
|
|
||||||
if ( powered [[ powered.range_func ]]( 1, localpower.origin, localpower.radius ) )
|
|
||||||
{
|
|
||||||
powered change_power( 1, localpower.origin, localpower.radius );
|
|
||||||
if ( !isDefined( localpower.added_list ) )
|
|
||||||
{
|
|
||||||
localpower.added_list = [];
|
|
||||||
}
|
|
||||||
localpower.added_list[ localpower.added_list.size ] = powered;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
thread watch_temp_powered_item( powered );
|
|
||||||
return powered;
|
|
||||||
}
|
|
||||||
|
|
||||||
watch_temp_powered_item( powered )
|
|
||||||
{
|
|
||||||
powered.target waittill( "death" );
|
|
||||||
remove_powered_item( powered );
|
|
||||||
if ( isDefined( level.local_power ) )
|
|
||||||
{
|
|
||||||
foreach ( localpower in level.local_power )
|
|
||||||
{
|
|
||||||
if ( isDefined( localpower.added_list ) )
|
|
||||||
{
|
|
||||||
arrayremovevalue( localpower.added_list, powered, 0 );
|
|
||||||
}
|
|
||||||
if ( isDefined( localpower.enabled_list ) )
|
|
||||||
{
|
|
||||||
arrayremovevalue( localpower.enabled_list, powered, 0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
change_power_in_radius( delta, origin, radius )
|
|
||||||
{
|
|
||||||
changed_list = [];
|
|
||||||
for ( i = 0; i < level.powered_items.size; i++ )
|
|
||||||
{
|
|
||||||
powered = level.powered_items[ i ];
|
|
||||||
if ( powered.power_sources != 2 )
|
|
||||||
{
|
|
||||||
if ( powered [[ powered.range_func ]]( delta, origin, radius ) )
|
|
||||||
{
|
|
||||||
powered change_power( delta, origin, radius );
|
|
||||||
changed_list[ changed_list.size ] = powered;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return changed_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
change_power( delta, origin, radius )
|
|
||||||
{
|
|
||||||
if ( delta > 0 )
|
|
||||||
{
|
|
||||||
if ( !self.power )
|
|
||||||
{
|
|
||||||
self.power = 1;
|
|
||||||
self [[ self.power_on_func ]]( origin, radius );
|
|
||||||
}
|
|
||||||
self.powered_count++;
|
|
||||||
}
|
|
||||||
else if ( delta < 0 )
|
|
||||||
{
|
|
||||||
if ( self.power )
|
|
||||||
{
|
|
||||||
self.power = 0;
|
|
||||||
self [[ self.power_off_func ]]( origin, radius );
|
|
||||||
}
|
|
||||||
self.depowered_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
revert_power_to_list( delta, origin, radius, powered_list )
|
|
||||||
{
|
|
||||||
for ( i = 0; i < powered_list.size; i++ )
|
|
||||||
{
|
|
||||||
powered = powered_list[ i ];
|
|
||||||
powered revert_power( delta, origin, radius );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
revert_power( delta, origin, radius, powered_list )
|
|
||||||
{
|
|
||||||
if ( delta > 0 )
|
|
||||||
{
|
|
||||||
self.depowered_count--;
|
|
||||||
if ( self.depowered_count == 0 && self.powered_count > 0 && !self.power )
|
|
||||||
{
|
|
||||||
self.power = 1;
|
|
||||||
self [[ self.power_on_func ]]( origin, radius );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( delta < 0 )
|
|
||||||
{
|
|
||||||
self.powered_count--;
|
|
||||||
if ( self.powered_count == 0 && self.power )
|
|
||||||
{
|
|
||||||
self.power = 0;
|
|
||||||
self [[ self.power_off_func ]]( origin, radius );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
add_local_power( origin, radius )
|
|
||||||
{
|
|
||||||
localpower = spawnstruct();
|
|
||||||
localpower.origin = origin;
|
|
||||||
localpower.radius = radius;
|
|
||||||
localpower.enabled_list = change_power_in_radius( 1, origin, radius );
|
|
||||||
if ( !isDefined( level.local_power ) )
|
|
||||||
{
|
|
||||||
level.local_power = [];
|
|
||||||
}
|
|
||||||
level.local_power[ level.local_power.size ] = localpower;
|
|
||||||
return localpower;
|
|
||||||
}
|
|
||||||
|
|
||||||
move_local_power( localpower, origin )
|
|
||||||
{
|
|
||||||
changed_list = [];
|
|
||||||
i = 0;
|
|
||||||
while ( i < level.powered_items.size )
|
|
||||||
{
|
|
||||||
powered = level.powered_items[ i ];
|
|
||||||
if ( powered.power_sources == 2 )
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
waspowered = isinarray( localpower.enabled_list, powered );
|
|
||||||
ispowered = powered [[ powered.range_func ]]( 1, origin, localpower.radius );
|
|
||||||
if ( ispowered && !waspowered )
|
|
||||||
{
|
|
||||||
powered change_power( 1, origin, localpower.radius );
|
|
||||||
localpower.enabled_list[ localpower.enabled_list.size ] = powered;
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ( !ispowered && waspowered )
|
|
||||||
{
|
|
||||||
powered revert_power( -1, localpower.origin, localpower.radius, localpower.enabled_list );
|
|
||||||
arrayremovevalue( localpower.enabled_list, powered, 0 );
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
localpower.origin = origin;
|
|
||||||
return localpower;
|
|
||||||
}
|
|
||||||
|
|
||||||
end_local_power( localpower )
|
|
||||||
{
|
|
||||||
if ( isDefined( localpower.enabled_list ) )
|
|
||||||
{
|
|
||||||
revert_power_to_list( -1, localpower.origin, localpower.radius, localpower.enabled_list );
|
|
||||||
}
|
|
||||||
localpower.enabled_list = undefined;
|
|
||||||
if ( isDefined( localpower.added_list ) )
|
|
||||||
{
|
|
||||||
revert_power_to_list( -1, localpower.origin, localpower.radius, localpower.added_list );
|
|
||||||
}
|
|
||||||
localpower.added_list = undefined;
|
|
||||||
arrayremovevalue( level.local_power, localpower, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
has_local_power( origin )
|
|
||||||
{
|
|
||||||
if ( isDefined( level.local_power ) )
|
|
||||||
{
|
|
||||||
foreach ( localpower in level.local_power )
|
|
||||||
{
|
|
||||||
if ( distancesquared( localpower.origin, origin ) < ( localpower.radius * localpower.radius ) )
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_powered_item_cost()
|
|
||||||
{
|
|
||||||
if ( !is_true( self.power ) )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ( is_true( level._power_global ) && self.power_sources != 1 )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
cost = [[ self.cost_func ]]();
|
|
||||||
power_sources = self.powered_count;
|
|
||||||
if ( power_sources < 1 )
|
|
||||||
{
|
|
||||||
power_sources = 1;
|
|
||||||
}
|
|
||||||
return cost / power_sources;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_local_power_cost( localpower )
|
|
||||||
{
|
|
||||||
cost = 0;
|
|
||||||
if ( isDefined( localpower ) && isDefined( localpower.enabled_list ) )
|
|
||||||
{
|
|
||||||
foreach ( powered in localpower.enabled_list )
|
|
||||||
{
|
|
||||||
cost += powered get_powered_item_cost();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ( isDefined( localpower ) && isDefined( localpower.added_list ) )
|
|
||||||
{
|
|
||||||
foreach ( powered in localpower.added_list )
|
|
||||||
{
|
|
||||||
cost += powered get_powered_item_cost();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cost;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_global_power( on_off )
|
|
||||||
{
|
|
||||||
maps/mp/_demo::bookmark( "zm_power", getTime(), undefined, undefined, 1 );
|
|
||||||
level._power_global = on_off;
|
|
||||||
for ( i = 0; i < level.powered_items.size; i++ )
|
|
||||||
{
|
|
||||||
powered = level.powered_items[ i ];
|
|
||||||
if ( isDefined( powered.target ) && powered.power_sources != 1 )
|
|
||||||
{
|
|
||||||
powered global_power( on_off );
|
|
||||||
wait_network_frame();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
global_power( on_off )
|
|
||||||
{
|
|
||||||
if ( on_off )
|
|
||||||
{
|
|
||||||
if ( !self.power )
|
|
||||||
{
|
|
||||||
self.power = 1;
|
|
||||||
self [[ self.power_on_func ]]();
|
|
||||||
}
|
|
||||||
self.powered_count++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
self.powered_count--;
|
|
||||||
if ( self.powered_count == 0 && self.power )
|
|
||||||
{
|
|
||||||
self.power = 0;
|
|
||||||
self [[ self.power_off_func ]]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
never_power_on( origin, radius )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
never_power_off( origin, radius )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
cost_negligible()
|
|
||||||
{
|
|
||||||
if ( isDefined( self.one_time_cost ) )
|
|
||||||
{
|
|
||||||
cost = self.one_time_cost;
|
|
||||||
self.one_time_cost = undefined;
|
|
||||||
return cost;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
cost_low_if_local()
|
|
||||||
{
|
|
||||||
if ( isDefined( self.one_time_cost ) )
|
|
||||||
{
|
|
||||||
cost = self.one_time_cost;
|
|
||||||
self.one_time_cost = undefined;
|
|
||||||
return cost;
|
|
||||||
}
|
|
||||||
if ( is_true( level._power_global ) )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ( is_true( self.self_powered ) )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cost_high()
|
|
||||||
{
|
|
||||||
if ( isDefined( self.one_time_cost ) )
|
|
||||||
{
|
|
||||||
cost = self.one_time_cost;
|
|
||||||
self.one_time_cost = undefined;
|
|
||||||
return cost;
|
|
||||||
}
|
|
||||||
return 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
door_range( delta, origin, radius )
|
|
||||||
{
|
|
||||||
if ( delta < 0 )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ( distancesquared( self.target.origin, origin ) < radius * radius )
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
door_power_on( origin, radius )
|
|
||||||
{
|
|
||||||
self.target.power_on = 1;
|
|
||||||
self.target notify( "power_on" );
|
|
||||||
}
|
|
||||||
|
|
||||||
door_power_off( origin, radius )
|
|
||||||
{
|
|
||||||
self.target notify( "power_off" );
|
|
||||||
self.target.power_on = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
door_local_power_on( origin, radius )
|
|
||||||
{
|
|
||||||
self.target.local_power_on = 1;
|
|
||||||
self.target notify( "local_power_on" );
|
|
||||||
}
|
|
||||||
|
|
||||||
door_local_power_off( origin, radius )
|
|
||||||
{
|
|
||||||
self.target notify( "local_power_off" );
|
|
||||||
self.target.local_power_on = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
cost_door()
|
|
||||||
{
|
|
||||||
if ( isDefined( self.target.power_cost ) )
|
|
||||||
{
|
|
||||||
if ( !isDefined( self.one_time_cost ) )
|
|
||||||
{
|
|
||||||
self.one_time_cost = 0;
|
|
||||||
}
|
|
||||||
self.one_time_cost += self.target.power_cost;
|
|
||||||
self.target.power_cost = 0;
|
|
||||||
}
|
|
||||||
if ( isDefined( self.one_time_cost ) )
|
|
||||||
{
|
|
||||||
cost = self.one_time_cost;
|
|
||||||
self.one_time_cost = undefined;
|
|
||||||
return cost;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
zombie_range( delta, origin, radius )
|
|
||||||
{
|
|
||||||
if ( delta > 0 )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
self.zombies = get_array_of_closest( origin, get_round_enemy_array(), undefined, undefined, radius );
|
|
||||||
if ( !isDefined( self.zombies ) )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
self.power = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
zombie_power_off( origin, radius )
|
|
||||||
{
|
|
||||||
for ( i = 0; i < self.zombies.size; i++ )
|
|
||||||
{
|
|
||||||
self.zombies[ i ] thread stun_zombie();
|
|
||||||
wait 0.05;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stun_zombie()
|
|
||||||
{
|
|
||||||
self endon( "death" );
|
|
||||||
self notify( "stun_zombie" );
|
|
||||||
self endon( "stun_zombie" );
|
|
||||||
if ( self.health <= 0 )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( is_true( self.ignore_inert ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( isDefined( self.stun_zombie ) )
|
|
||||||
{
|
|
||||||
self thread [[ self.stun_zombie ]]();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self thread maps/mp/zombies/_zm_ai_basic::start_inert();
|
|
||||||
}
|
|
||||||
|
|
||||||
perk_range( delta, origin, radius )
|
|
||||||
{
|
|
||||||
if ( isDefined( self.target ) )
|
|
||||||
{
|
|
||||||
perkorigin = self.target.origin;
|
|
||||||
if ( is_true( self.target.trigger_off ) )
|
|
||||||
{
|
|
||||||
perkorigin = self.target.realorigin;
|
|
||||||
}
|
|
||||||
else if ( is_true( self.target.disabled ) )
|
|
||||||
{
|
|
||||||
perkorigin += vectorScale( ( 0, 0, 1 ), 10000 );
|
|
||||||
}
|
|
||||||
if ( distancesquared( perkorigin, origin ) < radius * radius )
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
perk_power_on( origin, radius )
|
|
||||||
{
|
|
||||||
level notify( self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify() + "_on" );
|
|
||||||
maps/mp/zombies/_zm_perks::perk_unpause( self.target.script_noteworthy );
|
|
||||||
}
|
|
||||||
|
|
||||||
perk_power_off( origin, radius )
|
|
||||||
{
|
|
||||||
notify_name = self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify();
|
|
||||||
if ( isDefined( notify_name ) && notify_name == "revive" )
|
|
||||||
{
|
|
||||||
if ( level flag_exists( "solo_game" ) && flag( "solo_game" ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.target notify( "death" );
|
|
||||||
self.target thread maps/mp/zombies/_zm_perks::vending_trigger_think();
|
|
||||||
if ( isDefined( self.target.perk_hum ) )
|
|
||||||
{
|
|
||||||
self.target.perk_hum delete();
|
|
||||||
}
|
|
||||||
maps/mp/zombies/_zm_perks::perk_pause( self.target.script_noteworthy );
|
|
||||||
level notify( self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify() + "_off" );
|
|
||||||
}
|
|
||||||
|
|
||||||
pap_range( delta, origin, radius )
|
|
||||||
{
|
|
||||||
if ( isDefined( self.target ) )
|
|
||||||
{
|
|
||||||
paporigin = self.target.origin;
|
|
||||||
if ( is_true( self.target.trigger_off ) )
|
|
||||||
{
|
|
||||||
paporigin = self.target.realorigin;
|
|
||||||
}
|
|
||||||
else if ( is_true( self.target.disabled ) )
|
|
||||||
{
|
|
||||||
paporigin += vectorScale( ( 0, 0, 1 ), 10000 );
|
|
||||||
}
|
|
||||||
if ( distancesquared( paporigin, origin ) < ( radius * radius ) )
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pap_power_on( origin, radius )
|
|
||||||
{
|
|
||||||
level notify( "Pack_A_Punch_on" );
|
|
||||||
}
|
|
||||||
|
|
||||||
pap_power_off( origin, radius )
|
|
||||||
{
|
|
||||||
level notify( "Pack_A_Punch_off" );
|
|
||||||
self.target notify( "death" );
|
|
||||||
self.target thread maps/mp/zombies/_zm_perks::vending_weapon_upgrade();
|
|
||||||
}
|
|
||||||
|
|
||||||
pap_is_on()
|
|
||||||
{
|
|
||||||
if ( isDefined( self.powered ) )
|
|
||||||
{
|
|
||||||
return self.powered.power;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,576 +0,0 @@
|
|||||||
#include maps/mp/gametypes_zm/_globallogic;
|
|
||||||
#include maps/mp/zombies/_zm_weapons;
|
|
||||||
#include maps/mp/zombies/_zm_pers_upgrades;
|
|
||||||
#include maps/mp/gametypes_zm/_globallogic_score;
|
|
||||||
#include maps/mp/zombies/_zm_utility;
|
|
||||||
#include maps/mp/_utility;
|
|
||||||
#include common_scripts/utility;
|
|
||||||
|
|
||||||
init()
|
|
||||||
{
|
|
||||||
level.player_stats_init = ::player_stats_init;
|
|
||||||
level.add_client_stat = ::add_client_stat;
|
|
||||||
level.track_gibs = ::do_stats_for_gibs;
|
|
||||||
}
|
|
||||||
|
|
||||||
player_stats_init()
|
|
||||||
{
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "kills", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "downs", 0 );
|
|
||||||
self.downs = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "downs" );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "revives", 0 );
|
|
||||||
self.revives = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "revives" );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "perks_drank", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "headshots", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "gibs", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "head_gibs", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "melee_kills", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "grenade_kills", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "doors_purchased", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "distance_traveled", 0 );
|
|
||||||
self.distance_traveled = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "distance_traveled" );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "total_shots", 0 );
|
|
||||||
self.total_shots = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "total_shots" );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "hits", 0 );
|
|
||||||
self.hits = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "hits" );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "deaths", 0 );
|
|
||||||
self.deaths = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "deaths" );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "boards", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "wins", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "losses", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "time_played_total", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "weighted_rounds_played", 0 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_boarding", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_revivenoperk", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_multikill_headshots", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_cash_back_bought", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_cash_back_prone", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_insta_kill", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_nube_5_times", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_jugg", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_jugg_downgrade_count", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_carpenter", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_max_round_reached", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_flopper_counter", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_perk_lose_counter", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_pistol_points_counter", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_double_points_counter", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_sniper_counter", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_box_weapon_counter", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_melee_bonus_counter", 0, 1 );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_nube_counter", 0, 1 );
|
|
||||||
self maps/mp/zombies/_zm_pers_upgrades::pers_abilities_init_globals();
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "score", 0 );
|
|
||||||
if ( level.resetplayerscoreeveryround )
|
|
||||||
{
|
|
||||||
self.pers[ "score" ] = 0;
|
|
||||||
}
|
|
||||||
self.pers[ "score" ] = level.player_starting_points;
|
|
||||||
self.score = self.pers[ "score" ];
|
|
||||||
self incrementplayerstat( "score", self.score );
|
|
||||||
if ( isDefined( level.level_specific_stats_init ) )
|
|
||||||
{
|
|
||||||
[[ level.level_specific_stats_init ]]();
|
|
||||||
}
|
|
||||||
if ( !isDefined( self.stats_this_frame ) )
|
|
||||||
{
|
|
||||||
self.pers_upgrade_force_test = 1;
|
|
||||||
self.stats_this_frame = [];
|
|
||||||
self.pers_upgrades_awarded = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
update_players_stats_at_match_end( players )
|
|
||||||
{
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
game_mode = getDvar( "ui_gametype" );
|
|
||||||
game_mode_group = level.scr_zm_ui_gametype_group;
|
|
||||||
map_location_name = level.scr_zm_map_start_location;
|
|
||||||
if ( map_location_name == "" )
|
|
||||||
{
|
|
||||||
map_location_name = "default";
|
|
||||||
}
|
|
||||||
if ( isDefined( level.gamemodulewinningteam ) )
|
|
||||||
{
|
|
||||||
if ( level.gamemodulewinningteam == "B" )
|
|
||||||
{
|
|
||||||
matchrecorderincrementheaderstat( "winningTeam", 1 );
|
|
||||||
}
|
|
||||||
else if ( level.gamemodulewinningteam == "A" )
|
|
||||||
{
|
|
||||||
matchrecorderincrementheaderstat( "winningTeam", 2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
recordmatchsummaryzombieendgamedata( game_mode, game_mode_group, map_location_name, level.round_number );
|
|
||||||
newtime = getTime();
|
|
||||||
i = 0;
|
|
||||||
while ( i < players.size )
|
|
||||||
{
|
|
||||||
player = players[ i ];
|
|
||||||
if ( player is_bot() )
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
distance = player get_stat_distance_traveled();
|
|
||||||
player addplayerstatwithgametype( "distance_traveled", distance );
|
|
||||||
player add_location_gametype_stat( level.scr_zm_map_start_location, level.scr_zm_ui_gametype, "time_played_total", player.pers[ "time_played_total" ] );
|
|
||||||
recordplayermatchend( player );
|
|
||||||
recordplayerstats( player, "presentAtEnd", 1 );
|
|
||||||
player maps/mp/zombies/_zm_weapons::updateweapontimingszm( newtime );
|
|
||||||
if ( isDefined( level._game_module_stat_update_func ) )
|
|
||||||
{
|
|
||||||
player [[ level._game_module_stat_update_func ]]();
|
|
||||||
}
|
|
||||||
old_high_score = player get_game_mode_stat( game_mode, "score" );
|
|
||||||
if ( player.score_total > old_high_score )
|
|
||||||
{
|
|
||||||
player set_game_mode_stat( game_mode, "score", player.score_total );
|
|
||||||
}
|
|
||||||
if ( gamemodeismode( level.gamemode_public_match ) )
|
|
||||||
{
|
|
||||||
player gamehistoryfinishmatch( 4, 0, 0, 0, 0, 0 );
|
|
||||||
if ( isDefined( player.pers[ "matchesPlayedStatsTracked" ] ) )
|
|
||||||
{
|
|
||||||
gamemode = maps/mp/gametypes_zm/_globallogic::getcurrentgamemode();
|
|
||||||
player maps/mp/gametypes_zm/_globallogic::incrementmatchcompletionstat( gamemode, "played", "completed" );
|
|
||||||
if ( isDefined( player.pers[ "matchesHostedStatsTracked" ] ) )
|
|
||||||
{
|
|
||||||
player maps/mp/gametypes_zm/_globallogic::incrementmatchcompletionstat( gamemode, "hosted", "completed" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( !isDefined( player.pers[ "previous_distance_traveled" ] ) )
|
|
||||||
{
|
|
||||||
player.pers[ "previous_distance_traveled" ] = 0;
|
|
||||||
}
|
|
||||||
distancethisround = int( player.pers[ "distance_traveled" ] - player.pers[ "previous_distance_traveled" ] );
|
|
||||||
player.pers[ "previous_distance_traveled" ] = player.pers[ "distance_traveled" ];
|
|
||||||
player incrementplayerstat( "distance_traveled", distancethisround );
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
update_playing_utc_time( matchendutctime )
|
|
||||||
{
|
|
||||||
current_days = int( matchendutctime / 86400 );
|
|
||||||
last_days = self get_global_stat( "TIMESTAMPLASTDAY1" );
|
|
||||||
last_days = int( last_days / 86400 );
|
|
||||||
diff_days = current_days - last_days;
|
|
||||||
timestamp_name = "";
|
|
||||||
if ( diff_days > 0 )
|
|
||||||
{
|
|
||||||
for ( i = 5; i > diff_days; i-- )
|
|
||||||
{
|
|
||||||
timestamp_name = "TIMESTAMPLASTDAY" + ( i - diff_days );
|
|
||||||
timestamp_name_to = "TIMESTAMPLASTDAY" + i;
|
|
||||||
timestamp_value = self get_global_stat( timestamp_name );
|
|
||||||
self set_global_stat( timestamp_name_to, timestamp_value );
|
|
||||||
|
|
||||||
}
|
|
||||||
for ( i = 2; i <= diff_days && i < 6; i++ )
|
|
||||||
{
|
|
||||||
timestamp_name = "TIMESTAMPLASTDAY" + i;
|
|
||||||
self set_global_stat( timestamp_name, 0 );
|
|
||||||
}
|
|
||||||
self set_global_stat( "TIMESTAMPLASTDAY1", matchendutctime );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
survival_classic_custom_stat_update()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
grief_custom_stat_update()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
add_game_mode_group_stat( game_mode, stat_name, value )
|
|
||||||
{
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self adddstat( "PlayerStatsByGameTypeGroup", game_mode, stat_name, "statValue", value );
|
|
||||||
}
|
|
||||||
|
|
||||||
set_game_mode_group_stat( game_mode, stat_name, value )
|
|
||||||
{
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self setdstat( "PlayerStatsByGameTypeGroup", game_mode, stat_name, "statValue", value );
|
|
||||||
}
|
|
||||||
|
|
||||||
get_game_mode_group_stat( game_mode, stat_name )
|
|
||||||
{
|
|
||||||
return self getdstat( "PlayerStatsByGameTypeGroup", game_mode, stat_name, "statValue" );
|
|
||||||
}
|
|
||||||
|
|
||||||
add_game_mode_stat( game_mode, stat_name, value )
|
|
||||||
{
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self adddstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue", value );
|
|
||||||
}
|
|
||||||
|
|
||||||
set_game_mode_stat( game_mode, stat_name, value )
|
|
||||||
{
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self setdstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue", value );
|
|
||||||
}
|
|
||||||
|
|
||||||
get_game_mode_stat( game_mode, stat_name )
|
|
||||||
{
|
|
||||||
return self getdstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue" );
|
|
||||||
}
|
|
||||||
|
|
||||||
get_global_stat( stat_name )
|
|
||||||
{
|
|
||||||
return self getdstat( "PlayerStatsList", stat_name, "StatValue" );
|
|
||||||
}
|
|
||||||
|
|
||||||
set_global_stat( stat_name, value )
|
|
||||||
{
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self setdstat( "PlayerStatsList", stat_name, "StatValue", value );
|
|
||||||
}
|
|
||||||
|
|
||||||
add_global_stat( stat_name, value )
|
|
||||||
{
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self adddstat( "PlayerStatsList", stat_name, "StatValue", value );
|
|
||||||
}
|
|
||||||
|
|
||||||
get_map_stat( stat_name, map )
|
|
||||||
{
|
|
||||||
if ( !isDefined( map ) )
|
|
||||||
{
|
|
||||||
map = level.script;
|
|
||||||
}
|
|
||||||
return self getdstat( "PlayerStatsByMap", map, stat_name );
|
|
||||||
}
|
|
||||||
|
|
||||||
set_map_stat( stat_name, value, map )
|
|
||||||
{
|
|
||||||
if ( !isDefined( map ) )
|
|
||||||
{
|
|
||||||
map = level.script;
|
|
||||||
}
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self setdstat( "PlayerStatsByMap", map, stat_name, value );
|
|
||||||
}
|
|
||||||
|
|
||||||
add_map_stat( stat_name, value, map )
|
|
||||||
{
|
|
||||||
if ( !isDefined( map ) )
|
|
||||||
{
|
|
||||||
map = level.script;
|
|
||||||
}
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self adddstat( "PlayerStatsByMap", map, stat_name, value );
|
|
||||||
}
|
|
||||||
|
|
||||||
get_location_gametype_stat( start_location, game_type, stat_name )
|
|
||||||
{
|
|
||||||
return self getdstat( "PlayerStatsByStartLocation", start_location, "startLocationGameTypeStats", game_type, "stats", stat_name, "StatValue" );
|
|
||||||
}
|
|
||||||
|
|
||||||
set_location_gametype_stat( start_location, game_type, stat_name, value )
|
|
||||||
{
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self setdstat( "PlayerStatsByStartLocation", start_location, "startLocationGameTypeStats", game_type, "stats", stat_name, "StatValue", value );
|
|
||||||
}
|
|
||||||
|
|
||||||
add_location_gametype_stat( start_location, game_type, stat_name, value )
|
|
||||||
{
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self adddstat( "PlayerStatsByStartLocation", start_location, "startLocationGameTypeStats", game_type, "stats", stat_name, "StatValue", value );
|
|
||||||
}
|
|
||||||
|
|
||||||
get_map_weaponlocker_stat( stat_name, map )
|
|
||||||
{
|
|
||||||
if ( !isDefined( map ) )
|
|
||||||
{
|
|
||||||
map = level.script;
|
|
||||||
}
|
|
||||||
return self getdstat( "PlayerStatsByMap", map, "weaponLocker", stat_name );
|
|
||||||
}
|
|
||||||
|
|
||||||
set_map_weaponlocker_stat( stat_name, value, map )
|
|
||||||
{
|
|
||||||
if ( !isDefined( map ) )
|
|
||||||
{
|
|
||||||
map = level.script;
|
|
||||||
}
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( isDefined( value ) )
|
|
||||||
{
|
|
||||||
self setdstat( "PlayerStatsByMap", map, "weaponLocker", stat_name, value );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
self setdstat( "PlayerStatsByMap", map, "weaponLocker", stat_name, 0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
add_map_weaponlocker_stat( stat_name, value, map )
|
|
||||||
{
|
|
||||||
if ( !isDefined( map ) )
|
|
||||||
{
|
|
||||||
map = level.script;
|
|
||||||
}
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self adddstat( "PlayerStatsByMap", map, "weaponLocker", stat_name, value );
|
|
||||||
}
|
|
||||||
|
|
||||||
has_stored_weapondata( map )
|
|
||||||
{
|
|
||||||
if ( !isDefined( map ) )
|
|
||||||
{
|
|
||||||
map = level.script;
|
|
||||||
}
|
|
||||||
storedweapon = self get_map_weaponlocker_stat( "name", map );
|
|
||||||
if ( isDefined( storedweapon ) || isstring( storedweapon ) && storedweapon == "" || isint( storedweapon ) && storedweapon == 0 )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_stored_weapondata( map )
|
|
||||||
{
|
|
||||||
if ( !isDefined( map ) )
|
|
||||||
{
|
|
||||||
map = level.script;
|
|
||||||
}
|
|
||||||
if ( self has_stored_weapondata( map ) )
|
|
||||||
{
|
|
||||||
weapondata = [];
|
|
||||||
weapondata[ "name" ] = self get_map_weaponlocker_stat( "name", map );
|
|
||||||
weapondata[ "lh_clip" ] = self get_map_weaponlocker_stat( "lh_clip", map );
|
|
||||||
weapondata[ "clip" ] = self get_map_weaponlocker_stat( "clip", map );
|
|
||||||
weapondata[ "stock" ] = self get_map_weaponlocker_stat( "stock", map );
|
|
||||||
weapondata[ "alt_clip" ] = self get_map_weaponlocker_stat( "alt_clip", map );
|
|
||||||
weapondata[ "alt_stock" ] = self get_map_weaponlocker_stat( "alt_stock", map );
|
|
||||||
return weapondata;
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
clear_stored_weapondata( map ) //checked matches cerberus output
|
|
||||||
{
|
|
||||||
if ( !isDefined( map ) )
|
|
||||||
{
|
|
||||||
map = level.script;
|
|
||||||
}
|
|
||||||
self set_map_weaponlocker_stat( "name", "", map );
|
|
||||||
self set_map_weaponlocker_stat( "lh_clip", 0, map );
|
|
||||||
self set_map_weaponlocker_stat( "clip", 0, map );
|
|
||||||
self set_map_weaponlocker_stat( "stock", 0, map );
|
|
||||||
self set_map_weaponlocker_stat( "alt_clip", 0, map );
|
|
||||||
self set_map_weaponlocker_stat( "alt_stock", 0, map );
|
|
||||||
}
|
|
||||||
|
|
||||||
set_stored_weapondata( weapondata, map )
|
|
||||||
{
|
|
||||||
if ( !isDefined( map ) )
|
|
||||||
{
|
|
||||||
map = level.script;
|
|
||||||
}
|
|
||||||
self set_map_weaponlocker_stat( "name", weapondata[ "name" ], map );
|
|
||||||
self set_map_weaponlocker_stat( "lh_clip", weapondata[ "lh_clip" ], map );
|
|
||||||
self set_map_weaponlocker_stat( "clip", weapondata[ "clip" ], map );
|
|
||||||
self set_map_weaponlocker_stat( "stock", weapondata[ "stock" ], map );
|
|
||||||
self set_map_weaponlocker_stat( "alt_clip", weapondata[ "alt_clip" ], map );
|
|
||||||
self set_map_weaponlocker_stat( "alt_stock", weapondata[ "alt_stock" ], map );
|
|
||||||
}
|
|
||||||
|
|
||||||
add_client_stat( stat_name, stat_value, include_gametype )
|
|
||||||
{
|
|
||||||
if ( !self player_stat_exists( stat_name ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( getDvar( "ui_zm_mapstartlocation" ) == "" || is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( !isDefined( include_gametype ) )
|
|
||||||
{
|
|
||||||
include_gametype = 1;
|
|
||||||
}
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::incpersstat( stat_name, stat_value, 0, include_gametype );
|
|
||||||
self.stats_this_frame[ stat_name ] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
increment_player_stat( stat_name )
|
|
||||||
{
|
|
||||||
if ( !self player_stat_exists( stat_name ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( getDvar( "ui_zm_mapstartlocation" ) == "" || is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self incrementplayerstat( stat_name, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
increment_client_stat( stat_name, include_gametype )
|
|
||||||
{
|
|
||||||
if ( !self player_stat_exists( stat_name ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
add_client_stat( stat_name, 1, include_gametype );
|
|
||||||
}
|
|
||||||
|
|
||||||
set_client_stat( stat_name, stat_value, include_gametype )
|
|
||||||
{
|
|
||||||
if ( !self player_stat_exists( stat_name ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
current_stat_count = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( stat_name );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::incpersstat( stat_name, stat_value - current_stat_count, 0, include_gametype );
|
|
||||||
self.stats_this_frame[ stat_name ] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
zero_client_stat( stat_name, include_gametype )
|
|
||||||
{
|
|
||||||
if ( !self player_stat_exists( stat_name ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
current_stat_count = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( stat_name );
|
|
||||||
self maps/mp/gametypes_zm/_globallogic_score::incpersstat( stat_name, current_stat_count * -1, 0, include_gametype );
|
|
||||||
self.stats_this_frame[ stat_name ] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
increment_map_cheat_stat( stat_name )
|
|
||||||
{
|
|
||||||
if ( is_true( level.zm_disable_recording_stats ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self adddstat( "PlayerStatsByMap", level.script, "cheats", stat_name, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
get_stat_distance_traveled()
|
|
||||||
{
|
|
||||||
miles = int( self.pers[ "distance_traveled" ] / 63360 );
|
|
||||||
remainder = ( self.pers[ "distance_traveled" ] / 63360 ) - miles;
|
|
||||||
if ( miles < 1 && remainder < 0.5 )
|
|
||||||
{
|
|
||||||
miles = 1;
|
|
||||||
}
|
|
||||||
else if ( remainder >= 0.5 )
|
|
||||||
{
|
|
||||||
miles++;
|
|
||||||
}
|
|
||||||
return miles;
|
|
||||||
}
|
|
||||||
|
|
||||||
update_global_counters_on_match_end()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
get_specific_stat( stat_category, stat_name )
|
|
||||||
{
|
|
||||||
return self getdstat( stat_category, stat_name, "StatValue" );
|
|
||||||
}
|
|
||||||
|
|
||||||
do_stats_for_gibs( zombie, limb_tags_array )
|
|
||||||
{
|
|
||||||
if ( isDefined( zombie ) && isDefined( zombie.attacker ) && isplayer( zombie.attacker ) )
|
|
||||||
{
|
|
||||||
i = 0;
|
|
||||||
while ( i < limb_tags_array.size )
|
|
||||||
{
|
|
||||||
stat_name = undefined;
|
|
||||||
if ( limb == level._zombie_gib_piece_index_head )
|
|
||||||
{
|
|
||||||
stat_name = "head_gibs";
|
|
||||||
}
|
|
||||||
if ( !isDefined( stat_name ) )
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
zombie.attacker increment_client_stat( stat_name, 0 );
|
|
||||||
zombie.attacker increment_client_stat( "gibs" );
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
adjustrecentstats()
|
|
||||||
{
|
|
||||||
if ( !level.onlinegame || !gamemodeismode( level.gamemode_public_match ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self.pers[ "lastHighestScore" ] = self getdstat( "HighestStats", "highest_score" );
|
|
||||||
currgametype = level.gametype;
|
|
||||||
self gamehistorystartmatch( getgametypeenumfromname( currgametype, 0 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
uploadstatssoon()
|
|
||||||
{
|
|
||||||
self notify( "upload_stats_soon" );
|
|
||||||
self endon( "upload_stats_soon" );
|
|
||||||
self endon( "disconnect" );
|
|
||||||
wait 1;
|
|
||||||
uploadstats( self );
|
|
||||||
}
|
|
||||||
|
|
||||||
player_stat_exists( stat_name )
|
|
||||||
{
|
|
||||||
return isDefined( self.pers[ stat_name ] );
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,799 +0,0 @@
|
|||||||
#include maps/mp/zombies/_zm_zonemgr;
|
|
||||||
#include maps/mp/gametypes_zm/_zm_gametype;
|
|
||||||
#include maps/mp/zombies/_zm_utility;
|
|
||||||
#include maps/mp/_utility;
|
|
||||||
#include common_scripts/utility;
|
|
||||||
|
|
||||||
init()
|
|
||||||
{
|
|
||||||
flag_init( "zones_initialized" );
|
|
||||||
level.zones = [];
|
|
||||||
level.zone_flags = [];
|
|
||||||
level.zone_scanning_active = 0;
|
|
||||||
if ( !isDefined( level.create_spawner_list_func ) )
|
|
||||||
{
|
|
||||||
level.create_spawner_list_func = ::create_spawner_list;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
zone_is_enabled( zone_name )
|
|
||||||
{
|
|
||||||
if ( !isDefined( level.zones ) || !isDefined( level.zones[ zone_name ] ) || !level.zones[ zone_name ].is_enabled )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_player_zone()
|
|
||||||
{
|
|
||||||
player_zone = undefined;
|
|
||||||
keys = getarraykeys( level.zones );
|
|
||||||
for ( i = 0; i < keys.size; i++ )
|
|
||||||
{
|
|
||||||
if ( self entity_in_zone( keys[ i ] ) )
|
|
||||||
{
|
|
||||||
player_zone = keys[ i ];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return player_zone;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_zone_from_position( v_pos, ignore_enabled_check )
|
|
||||||
{
|
|
||||||
zone = undefined;
|
|
||||||
scr_org = spawn( "script_origin", v_pos );
|
|
||||||
keys = getarraykeys(level.zones);
|
|
||||||
for ( i = 0; i < keys.size; i++ )
|
|
||||||
{
|
|
||||||
if ( scr_org entity_in_zone( keys[ i ], ignore_enabled_check ) )
|
|
||||||
{
|
|
||||||
zone = keys [i ];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
scr_org delete();
|
|
||||||
return zone;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_zone_magic_boxes( zone_name )
|
|
||||||
{
|
|
||||||
if ( isDefined( zone_name ) && !zone_is_enabled( zone_name ) )
|
|
||||||
{
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
zone = level.zones[ zone_name ];
|
|
||||||
return zone.magic_boxes;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_zone_zbarriers( zone_name )
|
|
||||||
{
|
|
||||||
if ( isDefined( zone_name ) && !zone_is_enabled( zone_name ) )
|
|
||||||
{
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
zone = level.zones[ zone_name ];
|
|
||||||
return zone.zbarriers;
|
|
||||||
}
|
|
||||||
|
|
||||||
get_players_in_zone( zone_name, return_players )
|
|
||||||
{
|
|
||||||
if ( !zone_is_enabled( zone_name ) )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
zone = level.zones[zone_name];
|
|
||||||
num_in_zone = 0;
|
|
||||||
players_in_zone = [];
|
|
||||||
players = get_players();
|
|
||||||
for ( i = 0; i < zone.volumes.size; i++ )
|
|
||||||
{
|
|
||||||
for ( j = 0; j < players.size; j++ )
|
|
||||||
{
|
|
||||||
if ( players[ j ] istouching( zone.volumes[ i ] ) )
|
|
||||||
{
|
|
||||||
num_in_zone++;
|
|
||||||
players_in_zone[ players_in_zone.size ] = players[ j ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( isdefined( return_players ) )
|
|
||||||
{
|
|
||||||
return players_in_zone;
|
|
||||||
}
|
|
||||||
return num_in_zone;
|
|
||||||
}
|
|
||||||
|
|
||||||
player_in_zone( zone_name )
|
|
||||||
{
|
|
||||||
if ( !zone_is_enabled( zone_name ) )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
zone = level.zones[ zone_name ];
|
|
||||||
for ( i = 0; i < zone.volumes.size; i++ )
|
|
||||||
{
|
|
||||||
players = get_players();
|
|
||||||
for ( j = 0; j < players.size; j++ )
|
|
||||||
{
|
|
||||||
if ( players[ j ] istouching( zone.volumes[ i ] ) && !players[ j ] .sessionstate == "spectator" )
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
entity_in_zone( zone_name, ignore_enabled_check )
|
|
||||||
{
|
|
||||||
if ( !zone_is_enabled( zone_name ) && !is_true( ignore_enabled_check ) )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
zone = level.zones[ zone_name ];
|
|
||||||
for ( i = 0; i < zone.volumes.size; i++ )
|
|
||||||
{
|
|
||||||
if ( self istouching( zone.volumes[ i ] ) )
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
deactivate_initial_barrier_goals()
|
|
||||||
{
|
|
||||||
special_goals = getstructarray( "exterior_goal", "targetname" );
|
|
||||||
for ( i = 0; i < special_goals.size; i++ )
|
|
||||||
{
|
|
||||||
if ( isdefined( special_goals[ i ].script_noteworthy ) )
|
|
||||||
{
|
|
||||||
special_goals[ i ].is_active = 0;
|
|
||||||
special_goals[ i ] trigger_off();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
zone_init( zone_name )
|
|
||||||
{
|
|
||||||
|
|
||||||
if ( isDefined( level.zones[ zone_name ] ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
level.zones[ zone_name ] = spawnstruct();
|
|
||||||
zone = level.zones[ zone_name ];
|
|
||||||
zone.is_enabled = 0;
|
|
||||||
zone.is_occupied = 0;
|
|
||||||
zone.is_active = 0;
|
|
||||||
zone.adjacent_zones = [];
|
|
||||||
zone.is_spawning_allowed = 0;
|
|
||||||
|
|
||||||
spawn_points = maps/mp/gametypes_zm/_zm_gametype::get_player_spawns_for_gametype();
|
|
||||||
for( i = 0; i < spawn_points.size; i++ )
|
|
||||||
{
|
|
||||||
if ( spawn_points[ i ].script_noteworthy == zone_name )
|
|
||||||
{
|
|
||||||
spawn_points[ i ].locked = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
zone.volumes = [];
|
|
||||||
volumes = getentarray( zone_name, "targetname" );
|
|
||||||
i = 0;
|
|
||||||
for ( i = 0; i < volumes.size; i++ )
|
|
||||||
{
|
|
||||||
if ( volumes[ i ].classname == "info_volume" )
|
|
||||||
{
|
|
||||||
zone.volumes[ zone.volumes.size ] = volumes[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( isdefined( zone.volumes[ 0 ].target ) )
|
|
||||||
{
|
|
||||||
spots = getstructarray( zone.volumes[ 0 ].target, "targetname" );
|
|
||||||
zone.spawn_locations = [];
|
|
||||||
zone.dog_locations = [];
|
|
||||||
zone.screecher_locations = [];
|
|
||||||
zone.avogadro_locations = [];
|
|
||||||
zone.inert_locations = [];
|
|
||||||
zone.quad_locations = [];
|
|
||||||
zone.leaper_locations = [];
|
|
||||||
zone.brutus_locations = [];
|
|
||||||
zone.mechz_locations = [];
|
|
||||||
zone.astro_locations = [];
|
|
||||||
zone.napalm_locations = [];
|
|
||||||
zone.zbarriers = [];
|
|
||||||
zone.magic_boxes = [];
|
|
||||||
barricades = getstructarray( "exterior_goal", "targetname" );
|
|
||||||
box_locs = getstructarray( "treasure_chest_use", "targetname" );
|
|
||||||
for (i = 0; i < spots.size; i++)
|
|
||||||
{
|
|
||||||
spots[ i ].zone_name = zone_name;
|
|
||||||
if ( !is_true( spots[ i ].is_blocked ) )
|
|
||||||
{
|
|
||||||
spots[ i ].is_enabled = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
spots[ i ].is_enabled = 0;
|
|
||||||
}
|
|
||||||
tokens = strtok( spots[ i ].script_noteworthy, " " );
|
|
||||||
foreach ( token in tokens )
|
|
||||||
{
|
|
||||||
if ( token == "dog_location" )
|
|
||||||
{
|
|
||||||
zone.dog_locations[ zone.dog_locations.size ] = spots[ i ];
|
|
||||||
}
|
|
||||||
else if ( token == "screecher_location" )
|
|
||||||
{
|
|
||||||
zone.screecher_locations[ zone.screecher_locations.size ] = spots[ i ];
|
|
||||||
}
|
|
||||||
else if ( token == "avogadro_location" )
|
|
||||||
{
|
|
||||||
zone.avogadro_locations[ zone.avogadro_locations.size ] = spots[ i] ;
|
|
||||||
}
|
|
||||||
else if ( token == "inert_location" )
|
|
||||||
{
|
|
||||||
zone.inert_locations[ zone.inert_locations.size ] = spots[ i ];
|
|
||||||
}
|
|
||||||
else if ( token == "quad_location" )
|
|
||||||
{
|
|
||||||
zone.quad_locations[ zone.quad_locations.size ] = spots[ i ];
|
|
||||||
}
|
|
||||||
else if ( token == "leaper_location" )
|
|
||||||
{
|
|
||||||
zone.leaper_locations[ zone.leaper_locations.size ] = spots[ i ];
|
|
||||||
}
|
|
||||||
else if ( token == "brutus_location" )
|
|
||||||
{
|
|
||||||
zone.brutus_locations[ zone.brutus_locations.size ] = spots[ i ];
|
|
||||||
}
|
|
||||||
else if ( token == "mechz_location" )
|
|
||||||
{
|
|
||||||
zone.mechz_locations[ zone.mechz_locations.size ] = spots[ i ];
|
|
||||||
}
|
|
||||||
else if ( token == "astro_location" )
|
|
||||||
{
|
|
||||||
zone.astro_locations[ zone.astro_locations.size ] = spots[ i ];
|
|
||||||
}
|
|
||||||
else if ( token == "napalm_location" )
|
|
||||||
{
|
|
||||||
zone.napalm_locations[ zone.napalm_locations.size ] = spots[ i ];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
zone.spawn_locations[ zone.spawn_locations.size ] = spots[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( isdefined( spots[ i ].script_string ) )
|
|
||||||
{
|
|
||||||
barricade_id = spots[ i ].script_string;
|
|
||||||
for ( k = 0; k < barricades.size; k++ )
|
|
||||||
{
|
|
||||||
if ( isdefined( barricades[ k ].script_string ) && barricades[ k ].script_string == barricade_id )
|
|
||||||
{
|
|
||||||
nodes = getnodearray( barricades[ k ].target, "targetname" );
|
|
||||||
for ( j = 0; j < nodes.size; j++ )
|
|
||||||
{
|
|
||||||
if ( isdefined( nodes[ j ].type ) && nodes[ j ].type == "Begin" )
|
|
||||||
{
|
|
||||||
spots[ i ].target = nodes[ j ].targetname;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( i = 0; i < barricades.size; i++ )
|
|
||||||
{
|
|
||||||
targets = getentarray( barricades[ i ].target, "targetname" );
|
|
||||||
for ( j = 0; j < targets.size; j++ )
|
|
||||||
{
|
|
||||||
if ( targets[ j ] iszbarrier() && isdefined( targets[ j ].script_string ) && targets[ j ].script_string == zone_name )
|
|
||||||
{
|
|
||||||
zone.zbarriers[ zone.zbarriers.size ] = targets[ j ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( i = 0; i < box_locs.size; i++ )
|
|
||||||
{
|
|
||||||
chest_ent = getent( box_locs[ i ].script_noteworthy + "_zbarrier", "script_noteworthy" );
|
|
||||||
if ( chest_ent entity_in_zone( zone_name, 1 ) )
|
|
||||||
{
|
|
||||||
zone.magic_boxes[zone.magic_boxes.size] = box_locs[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enable_zone( zone_name )
|
|
||||||
{
|
|
||||||
if ( level.zones[ zone_name ].is_enabled )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
level.zones[ zone_name ].is_enabled = 1;
|
|
||||||
level.zones[zone_name].is_spawning_allowed = 1;
|
|
||||||
level notify( zone_name );
|
|
||||||
spawn_points = maps/mp/gametypes_zm/_zm_gametype::get_player_spawns_for_gametype();
|
|
||||||
for( i = 0; i < spawn_points.size; i++ )
|
|
||||||
{
|
|
||||||
if ( spawn_points[ i ].script_noteworthy == zone_name )
|
|
||||||
{
|
|
||||||
spawn_points[ i ].locked = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
entry_points = getstructarray( zone_name + "_barriers", "script_noteworthy" );
|
|
||||||
for( i = 0; i < entry_points.size; i++ )
|
|
||||||
{
|
|
||||||
entry_points[ i ].is_active = 1;
|
|
||||||
entry_points[ i ] trigger_on();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
make_zone_adjacent( main_zone_name, adj_zone_name, flag_name )
|
|
||||||
{
|
|
||||||
main_zone = level.zones[ main_zone_name ];
|
|
||||||
if ( !isDefined( main_zone.adjacent_zones[ adj_zone_name ] ) )
|
|
||||||
{
|
|
||||||
main_zone.adjacent_zones[ adj_zone_name ] = spawnstruct();
|
|
||||||
adj_zone = main_zone.adjacent_zones[ adj_zone_name ];
|
|
||||||
adj_zone.is_connected = 0;
|
|
||||||
adj_zone.flags_do_or_check = 0;
|
|
||||||
if ( isarray( flag_name ) )
|
|
||||||
{
|
|
||||||
adj_zone.flags = flag_name;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
adj_zone.flags[ 0 ] = flag_name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
adj_zone = main_zone.adjacent_zones[ adj_zone_name ];
|
|
||||||
size = adj_zone.flags.size;
|
|
||||||
adj_zone.flags_do_or_check = 1;
|
|
||||||
adj_zone.flags[ size ] = flag_name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
add_zone_flags( wait_flag, add_flags )
|
|
||||||
{
|
|
||||||
if ( !isarray( add_flags ) )
|
|
||||||
{
|
|
||||||
temp = add_flags;
|
|
||||||
add_flags = [];
|
|
||||||
add_flags[ 0 ] = temp;
|
|
||||||
}
|
|
||||||
keys = getarraykeys( level.zone_flags );
|
|
||||||
i = 0;
|
|
||||||
for ( i = 0; i < keys.size; i++ )
|
|
||||||
{
|
|
||||||
if ( keys[ i ] == wait_flag )
|
|
||||||
{
|
|
||||||
level.zone_flags[ keys[ i ] ] = arraycombine( level.zone_flags[ keys[ i ] ], add_flags, 1, 0 );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
level.zone_flags[ wait_flag ] = add_flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
add_adjacent_zone( zone_name_a, zone_name_b, flag_name, one_way )
|
|
||||||
{
|
|
||||||
if ( !isDefined( one_way ) )
|
|
||||||
{
|
|
||||||
one_way = 0;
|
|
||||||
}
|
|
||||||
if ( !isDefined( level.flag[ flag_name ] ) )
|
|
||||||
{
|
|
||||||
flag_init( flag_name );
|
|
||||||
}
|
|
||||||
zone_init( zone_name_a );
|
|
||||||
zone_init( zone_name_b );
|
|
||||||
make_zone_adjacent( zone_name_a, zone_name_b, flag_name );
|
|
||||||
if ( !one_way )
|
|
||||||
{
|
|
||||||
make_zone_adjacent( zone_name_b, zone_name_a, flag_name );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_zone_flag_waits()
|
|
||||||
{
|
|
||||||
flags = [];
|
|
||||||
zkeys = getarraykeys( level.zones );
|
|
||||||
for ( z = 0; z < level.zones.size; z++ )
|
|
||||||
{
|
|
||||||
zone = level.zones[ zkeys[ z ] ];
|
|
||||||
azkeys = getarraykeys( zone.adjacent_zones );
|
|
||||||
for ( az = 0; az < zone.adjacent_zones.size; az++ )
|
|
||||||
{
|
|
||||||
azone = zone.adjacent_zones[ azkeys[ az ] ];
|
|
||||||
for ( f = 0; f < azone.flags.size; f++ )
|
|
||||||
{
|
|
||||||
flags = add_to_array( flags, azone.flags[ f ], 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( i = 0; i < flags.size; i++ )
|
|
||||||
{
|
|
||||||
level thread zone_flag_wait( flags[ i ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
zone_flag_wait( flag_name )
|
|
||||||
{
|
|
||||||
if ( !isdefined( level.flag[ flag_name ] ) )
|
|
||||||
{
|
|
||||||
flag_init( flag_name );
|
|
||||||
}
|
|
||||||
flag_wait( flag_name );
|
|
||||||
flags_set = 0;
|
|
||||||
for ( z = 0; z < level.zones.size; z++ )
|
|
||||||
{
|
|
||||||
zkeys = getarraykeys( level.zones );
|
|
||||||
zone = level.zones[ zkeys[ z ] ];
|
|
||||||
for ( az = 0; az < zone.adjacent_zones.size; az++ )
|
|
||||||
{
|
|
||||||
azkeys = getarraykeys( zone.adjacent_zones );
|
|
||||||
azone = zone.adjacent_zones[ azkeys[ az ] ];
|
|
||||||
if ( !azone.is_connected )
|
|
||||||
{
|
|
||||||
if ( azone.flags_do_or_check )
|
|
||||||
{
|
|
||||||
flags_set = 0;
|
|
||||||
for ( f = 0; f < azone.flags.size; f++ )
|
|
||||||
{
|
|
||||||
if ( flag( azone.flags[ f ] ) )
|
|
||||||
{
|
|
||||||
flags_set = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
flags_set = 1;
|
|
||||||
for ( f = 0; f < azone.flags.size; f++ )
|
|
||||||
{
|
|
||||||
if ( !flag(azone.flags[ f ] ) )
|
|
||||||
{
|
|
||||||
flags_set = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( flags_set )
|
|
||||||
{
|
|
||||||
enable_zone( zkeys[ z ] );
|
|
||||||
azone.is_connected = 1;
|
|
||||||
if ( !level.zones[ azkeys[ az ] ].is_enabled )
|
|
||||||
{
|
|
||||||
enable_zone( azkeys[ az ] );
|
|
||||||
}
|
|
||||||
if ( flag( "door_can_close" ) )
|
|
||||||
{
|
|
||||||
azone thread door_close_disconnect( flag_name );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
keys = getarraykeys( level.zone_flags );
|
|
||||||
for ( i = 0; i < keys.size; i++ )
|
|
||||||
{
|
|
||||||
if ( keys[ i ] == flag_name )
|
|
||||||
{
|
|
||||||
check_flag = level.zone_flags[ keys[ i ] ];
|
|
||||||
for ( k = 0; k < check_flag.size; k++ )
|
|
||||||
{
|
|
||||||
flag_set( check_flag[ k ] );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
door_close_disconnect( flag_name )
|
|
||||||
{
|
|
||||||
while ( flag( flag_name ) )
|
|
||||||
{
|
|
||||||
wait 1;
|
|
||||||
}
|
|
||||||
self.is_connected = 0;
|
|
||||||
level thread zone_flag_wait( flag_name );
|
|
||||||
}
|
|
||||||
|
|
||||||
connect_zones( zone_name_a, zone_name_b, one_way )
|
|
||||||
{
|
|
||||||
if ( !isDefined( one_way ) )
|
|
||||||
{
|
|
||||||
one_way = 0;
|
|
||||||
}
|
|
||||||
zone_init( zone_name_a );
|
|
||||||
zone_init( zone_name_b );
|
|
||||||
enable_zone( zone_name_a );
|
|
||||||
enable_zone( zone_name_b );
|
|
||||||
if ( !isDefined( level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] ) )
|
|
||||||
{
|
|
||||||
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] = spawnstruct();
|
|
||||||
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].is_connected = 1;
|
|
||||||
}
|
|
||||||
if ( !one_way )
|
|
||||||
{
|
|
||||||
if ( !isDefined( level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] ) )
|
|
||||||
{
|
|
||||||
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] = spawnstruct();
|
|
||||||
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].is_connected = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
manage_zones( initial_zone )
|
|
||||||
{
|
|
||||||
|
|
||||||
deactivate_initial_barrier_goals();
|
|
||||||
zone_choke = 0;
|
|
||||||
spawn_points = maps/mp/gametypes_zm/_zm_gametype::get_player_spawns_for_gametype();
|
|
||||||
for ( i = 0; i < spawn_points.size; i++ )
|
|
||||||
{
|
|
||||||
spawn_points[ i ].locked = 1;
|
|
||||||
}
|
|
||||||
if ( isDefined( level.zone_manager_init_func ) )
|
|
||||||
{
|
|
||||||
[[ level.zone_manager_init_func ]]();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isarray( initial_zone ) )
|
|
||||||
{
|
|
||||||
for ( i = 0; i < initial_zone.size; i++ )
|
|
||||||
{
|
|
||||||
zone_init( initial_zone[ i ] );
|
|
||||||
enable_zone( initial_zone[ i ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
zone_init( initial_zone );
|
|
||||||
enable_zone( initial_zone );
|
|
||||||
}
|
|
||||||
setup_zone_flag_waits();
|
|
||||||
zkeys = getarraykeys( level.zones );
|
|
||||||
level.zone_keys = zkeys;
|
|
||||||
level.newzones = [];
|
|
||||||
for ( z = 0; z < zkeys.size; z++ )
|
|
||||||
{
|
|
||||||
level.newzones[ zkeys[ z ] ] = spawnstruct();
|
|
||||||
}
|
|
||||||
oldzone = undefined;
|
|
||||||
flag_set( "zones_initialized" );
|
|
||||||
flag_wait( "begin_spawning" );
|
|
||||||
while ( getDvarInt( "noclip" ) == 0 || getDvarInt( "notarget" ) != 0 )
|
|
||||||
{
|
|
||||||
for( z = 0; z < zkeys.size; z++ )
|
|
||||||
{
|
|
||||||
level.newzones[ zkeys[ z ] ].is_active = 0;
|
|
||||||
level.newzones[ zkeys[ z ] ].is_occupied = 0;
|
|
||||||
}
|
|
||||||
a_zone_is_active = 0;
|
|
||||||
a_zone_is_spawning_allowed = 0;
|
|
||||||
level.zone_scanning_active = 1;
|
|
||||||
z = 0;
|
|
||||||
while ( z < zkeys.size )
|
|
||||||
{
|
|
||||||
zone = level.zones[ zkeys[ z ] ];
|
|
||||||
newzone = level.newzones[ zkeys[ z ] ];
|
|
||||||
if( !zone.is_enabled )
|
|
||||||
{
|
|
||||||
z++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ( isdefined(level.zone_occupied_func ) )
|
|
||||||
{
|
|
||||||
newzone.is_occupied = [[ level.zone_occupied_func ]]( zkeys[ z ] );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
newzone.is_occupied = player_in_zone( zkeys[ z ] );
|
|
||||||
}
|
|
||||||
if ( newzone.is_occupied )
|
|
||||||
{
|
|
||||||
newzone.is_active = 1;
|
|
||||||
a_zone_is_active = 1;
|
|
||||||
if ( zone.is_spawning_allowed )
|
|
||||||
{
|
|
||||||
a_zone_is_spawning_allowed = 1;
|
|
||||||
}
|
|
||||||
if ( !isdefined(oldzone) || oldzone != newzone )
|
|
||||||
{
|
|
||||||
level notify( "newzoneActive", zkeys[ z ] );
|
|
||||||
oldzone = newzone;
|
|
||||||
}
|
|
||||||
azkeys = getarraykeys( zone.adjacent_zones );
|
|
||||||
for ( az = 0; az < zone.adjacent_zones.size; az++ )
|
|
||||||
{
|
|
||||||
if ( zone.adjacent_zones[ azkeys[ az ] ].is_connected && level.zones[ azkeys[ az ] ].is_enabled )
|
|
||||||
{
|
|
||||||
level.newzones[ azkeys[ az ] ].is_active = 1;
|
|
||||||
if ( level.zones[ azkeys[ az ] ].is_spawning_allowed )
|
|
||||||
{
|
|
||||||
a_zone_is_spawning_allowed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
zone_choke++;
|
|
||||||
if ( zone_choke >= 3 )
|
|
||||||
{
|
|
||||||
zone_choke = 0;
|
|
||||||
wait 0.05;
|
|
||||||
}
|
|
||||||
z++;
|
|
||||||
}
|
|
||||||
level.zone_scanning_active = 0;
|
|
||||||
for ( z = 0; z < zkeys.size; z++ )
|
|
||||||
{
|
|
||||||
level.zones[ zkeys[ z ] ].is_active = level.newzones[ zkeys[ z ] ].is_active;
|
|
||||||
level.zones[ zkeys[ z ] ].is_occupied = level.newzones[ zkeys[ z ] ].is_occupied;
|
|
||||||
}
|
|
||||||
if ( !a_zone_is_active || !a_zone_is_spawning_allowed )
|
|
||||||
{
|
|
||||||
if ( isarray( initial_zone ) )
|
|
||||||
{
|
|
||||||
level.zones[ initial_zone[ 0 ] ].is_active = 1;
|
|
||||||
level.zones[ initial_zone[ 0 ] ].is_occupied = 1;
|
|
||||||
level.zones[ initial_zone[ 0 ] ].is_spawning_allowed = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
level.zones[ initial_zone ].is_active = 1;
|
|
||||||
level.zones[ initial_zone ].is_occupied = 1;
|
|
||||||
level.zones[ initial_zone ].is_spawning_allowed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[[ level.create_spawner_list_func ]]( zkeys );
|
|
||||||
level.active_zone_names = maps/mp/zombies/_zm_zonemgr::get_active_zone_names();
|
|
||||||
wait 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
debug_show_spawn_locations()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
create_spawner_list( zkeys )
|
|
||||||
{
|
|
||||||
level.zombie_spawn_locations = [];
|
|
||||||
level.inert_locations = [];
|
|
||||||
level.enemy_dog_locations = [];
|
|
||||||
level.zombie_screecher_locations = [];
|
|
||||||
level.zombie_avogadro_locations = [];
|
|
||||||
level.quad_locations = [];
|
|
||||||
level.zombie_leaper_locations = [];
|
|
||||||
level.zombie_astro_locations = [];
|
|
||||||
level.zombie_brutus_locations = [];
|
|
||||||
level.zombie_mechz_locations = [];
|
|
||||||
level.zombie_napalm_locations = [];
|
|
||||||
for ( z = 0; z < zkeys.size; z++ )
|
|
||||||
{
|
|
||||||
zone = level.zones[ zkeys[ z ] ];
|
|
||||||
if ( zone.is_enabled && zone.is_active && zone.is_spawning_allowed )
|
|
||||||
{
|
|
||||||
for ( i = 0; i < zone.spawn_locations.size; i++ )
|
|
||||||
{
|
|
||||||
if(zone.spawn_locations[ i ].is_enabled)
|
|
||||||
{
|
|
||||||
level.zombie_spawn_locations[ level.zombie_spawn_locations.size ] = zone.spawn_locations[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( x = 0; x < zone.inert_locations.size; x++ )
|
|
||||||
{
|
|
||||||
if ( zone.inert_locations[ x ].is_enabled)
|
|
||||||
{
|
|
||||||
level.inert_locations[ level.inert_locations.size ] = zone.inert_locations[ x ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( x = 0; x < zone.dog_locations.size; x++ )
|
|
||||||
{
|
|
||||||
if ( zone.dog_locations[ x ].is_enabled )
|
|
||||||
{
|
|
||||||
level.enemy_dog_locations[ level.enemy_dog_locations.size ] = zone.dog_locations[ x ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( x = 0; x < zone.screecher_locations.size; x++ )
|
|
||||||
{
|
|
||||||
if ( zone.screecher_locations[ x ].is_enabled)
|
|
||||||
{
|
|
||||||
level.zombie_screecher_locations[ level.zombie_screecher_locations.size ] = zone.screecher_locations[ x ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( x = 0; x < zone.avogadro_locations.size; x++ )
|
|
||||||
{
|
|
||||||
if ( zone.avogadro_locations[ x ].is_enabled)
|
|
||||||
{
|
|
||||||
level.zombie_avogadro_locations[ level.zombie_avogadro_locations.size ] = zone.avogadro_locations[ x ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( x = 0; x < zone.quad_locations.size; x++ )
|
|
||||||
{
|
|
||||||
if ( zone.quad_locations[ x ].is_enabled )
|
|
||||||
{
|
|
||||||
level.quad_locations[ level.quad_locations.size ] = zone.quad_locations[ x ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( x = 0; x < zone.leaper_locations.size; x++ )
|
|
||||||
{
|
|
||||||
if ( zone.leaper_locations[ x ].is_enabled )
|
|
||||||
{
|
|
||||||
level.zombie_leaper_locations[ level.zombie_leaper_locations.size ] = zone.leaper_locations[ x ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( x = 0; x < zone.astro_locations.size; x++ )
|
|
||||||
{
|
|
||||||
if ( zone.astro_locations[ x ].is_enabled )
|
|
||||||
{
|
|
||||||
level.zombie_astro_locations[ level.zombie_astro_locations.size ] = zone.astro_locations[ x ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( x = 0; x < zone.napalm_locations.size; x++ )
|
|
||||||
{
|
|
||||||
if ( zone.napalm_locations[x].is_enabled )
|
|
||||||
{
|
|
||||||
level.zombie_napalm_locations[ level.zombie_napalm_locations.size ] = zone.napalm_locations[ x ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( x = 0; x < zone.brutus_locations.size; x++ )
|
|
||||||
{
|
|
||||||
if ( zone.brutus_locations[ x ].is_enabled )
|
|
||||||
{
|
|
||||||
level.zombie_brutus_locations[ level.zombie_brutus_locations.size ] = zone.brutus_locations[ x ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ( x = 0; x < zone.mechz_locations.size; x++ )
|
|
||||||
{
|
|
||||||
if ( zone.mechz_locations[ x ].is_enabled )
|
|
||||||
{
|
|
||||||
level.zombie_mechz_locations[level.zombie_mechz_locations.size] = zone.mechz_locations[ x ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
get_active_zone_names()
|
|
||||||
{
|
|
||||||
ret_list = [];
|
|
||||||
if ( !isDefined( level.zone_keys ) )
|
|
||||||
{
|
|
||||||
return ret_list;
|
|
||||||
}
|
|
||||||
while ( level.zone_scanning_active )
|
|
||||||
{
|
|
||||||
wait 0.05;
|
|
||||||
}
|
|
||||||
for ( i = 0; i < level.zone_keys.size; i++ )
|
|
||||||
{
|
|
||||||
if ( level.zones[ level.zone_keys[ i ] ].is_active )
|
|
||||||
{
|
|
||||||
ret_list[ ret_list.size ] = level.zone_keys[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
is_player_in_zone( zone_name ) //checked changed to match cerberus output
|
|
||||||
{
|
|
||||||
zone = level.zones[ zone_name ];
|
|
||||||
for ( i = 0; i < zone.volumes.size; i++ )
|
|
||||||
{
|
|
||||||
if ( self istouching( level.zones[zone_name].volumes[ i ] ) && !self.sessionstate == "spectator" )
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,4 +0,0 @@
|
|||||||
main()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user